#swing — Java,Swing


Содержание

Графический интерфейс на Java Swing — GUI Tutorial

В Java есть 2 основных пакета для создания графических интерфейсов (Graphics User Interface). Это Abstract Windows Toolkit (AWT) и Swing. AWT использует виджеты операционной системы, поэтому эта библиотека немного быстрее. Но на мой взгляд, Swing более хорошо спроектирован.

В данном туториале мы рассмотрим основные элементы библиотеки Swing и создадим простой интерфейс (GUI) в качестве примера.

Для группировки компонент интерфейса используются контейнеры (Container). Для создания основного контейнера для приложения чаще всего используется контейнер JFrame (есть еще JWindows и JApplet). Проще всего унаследоваться от JFrame тем самым получить доступ ко множеству методов, например:

setBounds(x, y, w, h) — указывает координаты верхней левой вершины окна, а также его ширину и высоту.

setResizable(bool) — указывает, можно ли изменять размер окна.

setTitle(str) — устанавливает название окна.

setVisible(bool) — собственно отображает окно.

setDefaultCloseOperation(operation) — указывает операцию, которая будет произведена при закрытии окна.

Основные элементы управления:

  • JLabel — элемент для отображения фиксированного текста;
  • JTextField — простой edit-box;
  • JButton — обычная кнопка (button);
  • JCheckBox — элемент выбора (аналог checkbox);
  • JRadioButton — радио кнопка

Как видите, все довольно просто и логично.

При отображении элементов управления используются специальные менеджеры — LayoutManager. У всех LayoutManager’ов есть методы для добавления у удаления элементов.

FlowLayout — используется для последовательного отображения элементов. Если элемент не помещается в конкретную строку, он отображается в следующей.

GridLayout — отображения элементов в виде таблицы с одинаковыми размерами ячеек.

BorderLayout — используется при отображении не более 5 элементов. Эти элементы располагаются по краям фрейма и в ценрте: North, South, East, West, Center.

BoxLayout — отображает элементы в виде рядка или колонки.

GridBagLayout — позволяет назначать месторасположение и размер каждого виджета. Это самый сложный, но и самый эффективный вид отображения.

Стоит еще обратить внимание на обработку событий. Для этого используются так называемые Event Listeners.

Ну все, довольно теории, перейдем к примеру GUI:

getContentPane возвращает контейнер верхнего уровня. ButtonGroup служит для создания группы взаимосвязанных радио-кнопок.

Внутренний класс ButtonActionListener реализует интерфейс ActionListener. Для этого необходимо предоставить имплементацию метода actionPerformed.

JOptionPane служит для отображения диалоговых окон.

Жду ваших вопросов и комментариев. Если вы хотите больше узнать о Swing, скажите об этом, и в скором времени я напишу еще одну статью с более сложными приемами и компонентами.

Лекция 09. GUI.Swing¶

Введение¶

Пакеты¶

Для построения GUI в Java используются следующие основные пакеты:

  1. Awt — появился в первых версиях, используется мало.
  2. Swing — самый популярный пакет.
  3. JavaFX — современный и перспективный.

Awt пример¶


Swing пример¶

JavaFX пример¶

Сравнение¶

Недостатки awt:

  • ‘’тяжеловесные’’ компоненты (системозависимые);
  • невозможность изменения внешнего вида.

Недостатки swing:

  • ограничения в изменении внешнего вида;
  • ориентация на desktop-приложения.

Swing¶

Простое приложение¶

Рассмотрим простейшее Swing-приложение.

Контейнеры верхнего уровня¶

Все swing-программы должны включать в себя Контейнеры первого уровня

  • JFrame
  • JApplet
  • JWindow
  • JDialog

Эти контейнеры находятся на вершине иерархии контейнеров и

содержат в себе другие, ‘’легковесные’’ контейнеры и элементы

управления. Разница между JFrame и JWindow может быть показана

на следующем примере:

Окно JFrame, в отличие от JWindow

Java. От простого к сложному

Уроки по языку программирования java для начинающих

вторник, 1 апреля 2014 г.

Java Swing. Простое окно с кнопкой

Создадим файл MyWindow.java:

Здесь переменную balance мы сделали атрибутом класса, чтобы к ней можно было обратиться из метода этого класса. По аналогичной причине мы поместили лейбл balanceLabel в атрибут класса, и это нам позволило обратиться к нему из метода updateBalance().
На кнопку btnIncrease мы установили слушатель событий посредством создания экземпляра класса ActionListener, в котором переопределили метод actionPerformed.

IT-ЗАМЕТКИ

Инструменты пользователя

Инструменты сайта

Содержание


AWT и Swing

В первой версии языка Java для работы с графикой было только библиотека AWT. Эта библиотека – простой набор классов, таких, как Button(кнопка),TextField (текстовое поле), Label (текстовая метка или иконка) и другие.
Вскоре была создана более совершенная библиотека, которую назвали Swing. Она так же включает в себя кнопки,текстовые поля и другие элементы управления графическими приложениями. Названия компонентов этой библиотеке начинается с буквы J. Например JButton, JTextField и т.д.

Работать в Swing лучше, быстрей и удобней.

Основные элементы Swing

Вот некоторые основные объекты, из которых состоят Swing приложения:

Например, можно создать экземпляр класса JPanel и назначить для него схему размещения. Затем создайте различные графические компоненты и добавьте их на панель. После этого добавьте панель на фрейм, задать его размер и сделать его видимым.

JFrame является главным окном для размещения компонентов и представляет их пользователю.

Панель

Панель JPanel — это элемент управления, представляющий собой прямоугольное пространство, на котором можно размещать другие элементы. Элементы добавляются и удаляются методами, унаследованными от класса Container.

У каждой панели есть менеджер размещения, который определяет стратегию взаимного расположения элементов, добавляемых на панель. Его можно изменить методом setLayout(LayoutManager manager).

Оконные элементы управления

Класс JComponent

Все визуальные компоненты библиотеки Swing унаследованы от класса JComponent. Сам этот класс является абстрактными и непосредственно не используется, но все визуальные компоненты наследуют его методы.

Метка JLabel

В большинстве визуальных библиотек метка — один из самых простейших компонентов. Она представляет собой обычный текст, который выводится в заданном месте окна и используется для вывода вспомогательной текстовой информации: подписи к другим элементам, инструкции и предупреждения для пользователя.

Кнопка JButton

Компоненты JToggleButton, JCheckBox, JRadioButton

Компонент JToggleButton представляет собой кнопку, которая может находиться в двух состояниях: нажатом и отпущенном.
Когда пользователь щелкает мышкой по такой кнопке, она изменяет свое состояние. Именно таким образом ведут себя кнопки форматирования на инструментальной панели текстового редактора. Кнопка [I] не только устанавливает или убирает курсивное начертание в выделенном тексте, но и сигнализирует о его наличии или отсутствии.

От класса JToggleButton унаследован класс JCheckBox — флажок.
Этот класс имеет точно такой же набор конструкторов и методов, т.е. не расширяет функциональность предка. Единственное различие между ними — во внешнем виде: JCheckBox выглядит не как кнопка, а как небольшой квадратик, в котором можно поставить или убрать галочку.

Аналогичным образом ведет себя класс JRadioButton — переключатель или радиокнопка, внешне выглядящая как пустой кружок, когда она не выделена и кружок с точкой в выделенном состоянии.

Для того, чтобы элементы объединить в группу, используется специальный контейнер ButtonGroup Если добавить в один такой контейнер несколько элементов JRadioButton, то выбранным всегда будет только один из них.

Текстовое поле JTextField

Для создания текстового поля чаще всего используются конструкторы:

Поле для ввода пароля JPasswordField

JPasswordField является прямым потомком JTextField, поэтому для него справедливо все сказанное выше. JPasswordField является прямым потомком JTextField, поэтому для него справедливо все сказанное выше.

Область для ввода текста JTextArea

JTextArea также является потомком JTextField и наследует все его методы.

Панель прокрутки JScrollPane

JScrollPane — панель прокрутки. Чаще всего она просто «надевается» на требуемый объект посредством собственного конструктора, принимающего этот объект в качестве параметра. Например, чтобы текстовая область textArea из предыдущего примера обрела полосы прокрутки, необходимо заменить команду

Инструментальная панель JToolBar

В Swing для инструментальных панелей разработан визуальный компонент JToolBar, в котором заложена просто потрясающая функциональность.

Выпадающий список JComboBox


Выпадающий список — весьма распространенный элемент управления. Он содержит множество вариантов, из которых пользователь может выбрать один и только один, либо (если выпадающий список это позволяет) ввести свой собственный.

Ползунок JSl >

Ползунок позволяет пользователю выбрать некоторое число из диапазона доступных значений, наглядно представив этот диапазон.

Панель со вкладками JTabbedPane

Многим программам бывает необходимо разместить в одном окне большое количество элементов управления, некоторые из которых (такие как списки, деревья, текстовые области и т.д.) могут к тому же занимать приличное пространство.

Список JList

Список содержит группу элементов, аналогично выпадающему списку JComboBox, но обладает двумя отличительными особенностями. Во-первых, на экране видны одновременно несколько элементов списка. Во-вторых, пользователь может выбрать в списке не один элемент, а несколько (если установлен соответствующий режим выделения).

Создать список можно с помощью конструктора, работающего на основе массива Object[] или вектора Vector (аналогично JComboBox).

JTable Таблицы

Для отображения табличных данных используется комопнент JTable. JTable внутри себя не содержит данные, а служит только для их отображения.

JFileChooser для выбора файла

При работе с файлами из приложения возникает необходимость рано или поздно использовать диалог для выбора файлов.

JProgressBar полоса загрузки

JMenuBar

Стандартные диалоговые окна

Менеджер размещения

В некоторых старомодных языках программирования необходимо было указывать координаты и размеры каждого компонента окна. Это работало хорошо, если было известно разрешающая способность экрана каждого пользователя. В Java есть схемы размещения (Layout Managers) , которые позволяют разместить компоненты на экране, не зная точных позиций компонентов. Схемы гарантируют, что та часть интерфейса, за которую они отвечают, будет выглядеть правильно в не зависимости от размеров окна и разрешения экрана.

Менеджер последовательного размещения FlowLayout

Менеджер граничного размещения BorderLayout

Менеджер размещения BorderLayout разделяет панель на пять областей: центральную, верхнюю, нижнюю, правую и левую. В каждую из этих областей можно добавить ровно по одному компоненту, причем компонент будет занимать всю отведенную для него область. Компоненты, добавленные в верхнюю и нижнюю области, будут растянуты по ширине. обавленные в правую и левую — по высоте, а компонент, добавленный в центр, будет растянут так, чтобы полностью заполнить оставшееся пространство панели.

Цукерберг рекомендует:  Подсказки Bubble Point с помощью CSS3, HTML5 и jQuery

При добавлении элемента на панель с менеджером размещения BorderLayout, необходимо дополнительно указывать в методе add(), какая из областей имеется в виду. Для этого служат строки с названиями сторон света: «North», «South», «East», «West» и «Center». Но вместо них рекомендуется использовать константы, определенные в классе BorderLayout: NORTH, SOUTH, EAST, WEST и CENTER (поскольку в строке можно допустить ошибку и не заметить этого, а при попытке написать неправильно имя константы компилятор выдаст предупреждение).

Менеджер табличного размещения Gr >

GridLayout разбивает панель на ячейки одинаковой ширины и высоты (таким образом окно становится похожим на таблицу). Каждый элемент, добавляемый на панель с таким расположением, целиком занимает одну ячейку. Ячейки заполняются элементами по очереди, начиная с левой верхней.

Этот менеджер, в отличие от рассмотренных ранее, создается конструктором с параметрами (четыре целых числа). Необходимо указать количество столбцов, строк и расстояние между ячейками по горизонтали и по вертикали.

Менеджер блочного размещения BoxLayout и класс Box

Менеджер BoxLayout размещает элементы на панели в строку или в столбец. Обычно для работы с этим менеджером используют вспомогательный класс Box, представляющий собой панель, для которой уже настроено блочное размещение. Создается такая панель не конструктором, а одним из двух статических методов, определенных в классе Box: createHorizontalBox() и createVerticalBox().

Элементы, добавленные на панель с блочным размещением, выстраиваются один за другим. Расстояние между элементами по умолчанию нулевое. Однако вместо компонента можно добавить невидимую «распорку», единственная задача которой — раздвигать соседние элементы, обеспечивая между ними заданное расстояние.

Горизонтальная распорка создается статическим методом createHorizontalStrut(int width), а вертикальная — методом createVerticalStrut(int height). Оба метода определены в классе Box, а целочисленный параметр в каждом из них определяет размер распорки.

Ручное размещение элементов

Если в качестве менеджера размещения панели установить null, элементы не будут расставляться автоматически. Координаты каждого элемента необходимо в этом случае указать явно, при этом они никак не зависят от размеров панели и от координат других элементов. По умолчанию координаты равны нулю (т.е. элемент расположен в левом верхнем углу панели). Размер элемента также необходимо задавать явно (в противном случае его ширина и высота будут равны нулю и элемент отображаться не будет). Координаты элемента можно задать одним из следующих методов:

Java Swing Tutorial for beginners


By Chaitanya Singh | Filed Under: Swing

Swing is a part of Java Foundation classes (JFC), the other parts of JFC are java2D and Abstract window toolkit (AWT). AWT, Swing & Java 2D are used for building graphical user interfaces (GUIs) in java. In this tutorial we will mainly discuss about Swing API which is used for building GUIs on the top of AWT and are much more light-weight compared to AWT.

A Simple swing example

In the below example we would be using several swing components that you have not learnt so far in this tutorial. We will be discussing each and everything in detail in the coming swing tutorials.
The below swing program would create a login screen.

Output:

In the above example we have used several components. Let’s discuss a bit about them first then we will discuss them in detail in the next tutorials.
JFrame – A frame is an instance of JFrame. Frame is a window that can have title, border, menu, buttons, text fields and several other components. A Swing application must have a frame to have the components added to it.

JPanel
– A panel is an instance of JPanel. A frame can have more than one panels and each panel can have several components. You can also call them parts of Frame. Panels are useful for grouping components and placing them to appropriate locations in a frame.

JLabel – A label is an instance of JLabel class. A label is unselectable text and images. If you want to display a string or an image on a frame, you can do so by using labels. In the above example we wanted to display texts “User” & “Password” just before the text fields , we did this by creating and adding labels to the appropriate positions.

JTextField – Used for capturing user inputs, these are the text boxes where user enters the data.

JPasswordField – Similar to text fields but the entered data gets hidden and displayed as dots on GUI.

JButton – A button is an instance of JButton class. In the above example we have a button “Login”.

Записки программиста

Краткий обзор GUI-фреймворков для Java и мое первое простенькое GUI-приложение на Swing

Так исторически сложилось, что с UI мне приходилось работать очень мало. Видимо, поэтому мне так интересные всякие там Qt и wxW >

Ситуация с GUI фреймворками в мире Java несколько запутанная. Насколько я смог разобраться, дела обстоят следующим образом.

  • AWT (Abstract Window Toolkit) был первым GUI фреймворком. Идея была правильная — AWT использует нативные контролы, то есть, они выглядят и физически являются родными, независимо от того, где вы запускаете свое приложение. К сожалению, оказалось, что (1) общих для различных окружений контролов мало и (2) писать кроссплатформенные нативные интерфейсы так, чтобы ничего не поползло и не разъехалось, очень сложно;
  • Поэтому на смену AWT пришел Swing. Swing использует формочки, создаваемые AWT, на которых он своими силами рисует контролы. Работает это хозяйство, понятно дело, медленнее, но зато UI становится намного более портабельным. Swing предлагает на выбор программисту множество Look&Feel, благодаря которым можно сделать либо так, чтобы приложение выглядело и вело себя одинаково как под Windows, так и под Linux, либо чтобы приложение было очень похоже на нативное независимо от того, где его запускают. В первом случае приложение проще отлаживать, во втором — становятся счастливее пользователи. Кстати, изначально Swing был сделан парнями из Netscape;
  • SWT (Standard W >всех-всех-всех платформ, и тогда приложение вроде как даже станет портабельным, но только до тех пор, пока не появится какая-нибудь новая операционная система или архитектура процессора;
  • JavaFX активно пилится в Oracle и позиционируется, как скорая замена Swing. Идеологически JavaFX похож на Swing, то есть, контролы не нативные. Среди интересных особенностей JavaFX следует отметить хардверное ускорение, создание GUI при помощи CSS и XML (FXML), возможность использовать контролы JavaFX’а в Swing’е, а также кучу новых красивых контролов, в том числе для рисования диаграмм и 3D. Видео с более детальным обзором JavaFX можно посмотреть здесь. Начиная с Java 7, JavaFX является частью JRE/JDK;
  • NetBeans Platform (не путать с NetBeans IDE!) — это такая штука, которая, как я понял, работает поверх Swing и JavaFX, предоставляет как бы более удобный интерфейс для работы с ними, а также всякие дополнительные контролы. В одном приложении, использующем NetBeans Platform, я видел возможность перетаскивать вкладки drug&drop’ом, располагая панели в окне подобно тому, как это делают тайловые оконные менеджеры. По всей видимости, сам Swing так не умеет. Почитать про NetBeans Platform поподробнее можно здесь;

Не исключено, что есть и другие фреймворки. Наиболее каноничным на сегодняшний день является Swing, поэтому им и займемся.

Выше что-то говорилось про какие-то там Look&Feel. Чтобы лучше понять, о чем идет речь, давайте напишем программу, которая выводит список этих самых Look&Feel и позволит переключаться между ними прямо в процессе работы программы.

Наше приложение будет выглядеть следующим образом под Ubuntu:

А так оно будет выглядеть при запуске под Windows:

Как видите, JRE под Windows и Linux включают в себя разный набор L&F. Кроме того, вы можете подключить сторонний Look&Feel или даже написать свой. По умолчанию используется L&F Metal, который во всех ОС и оконных менеджерах выглядит более-менее одинаково. Если вам больше нравятся круглые кнопочки, то вместо Metal можно использовать Look&Feel Nimbus. Если вам хочется, чтобы приложение было похоже на нативное, то под Linux следует выбрать L&F GTK+ (интересно, а если пользователь сидит под KDE?), а под Windows — L&F Windows. Неплохой идеей, видимо, будет предусмотреть в вашей программе возможность переключаться между различными L&F. С другой стороны, при этом придется тестировать работу приложения со всеми этими L&F.

Давайте посмотрим на исходный код приложения. Коллеги UI-щики заверили меня, что никаких WYSIWYG редакторов они не используют, а если используют, то разве что для быстрого прототипирования. Из неплохих WYSIWYG редакторов назывался JFormDesigner. Говорят, генерируемый им код даже похож на код, написанный человеком, а не адовую().последовательность().вызовов().методов(). В общем, весь код писался лапками в IntelliJ IDEA.

В Swing и AWT, если мы хотим что-то поменять в UI, мы должны делать это из event dispatching thread. Статический метод invokeLater принимает класс, реализующий интерфейс Runnable, и вызывает его метод run() внутри event dispatching thread. Если вам не знаком приведенный выше синтаксис, то это такой способ в Java объявить класс, не присваивая ему имени. Классы без имени называются анонимными. Часто анонимные классы в Java выполняют ту же роль, что играют лямда-фукнции в функциональных языках программирования. Помимо прочего, поддерживаются и замыкания. Интересно, что, в отличие от лямбд, анонимные классы в Java позволяют передать сразу пачку методов. Притом, при помощи наследования и абстрактных классов, для всех или части методов можно взять их реализацию по умолчанию.

Аннотация @Override проверяет, что метод run() действительно переопределит метод интерфейса Runnable. Без нее при переопределении метода мы можем случайно сделать опечатку и определить новый метод вместо того, чтобы переопределить существующий. Впрочем, в данном конкретном случае аннотация, видимо, не очень полезна, и, наверное, даже является лишней.

В итоге event dispatching thread вызовет метод createGUI(), полный код которого следующий:

private static void createGUI ( ) <
JList String > list = new JList <> ( ) ;
list. setSelectionMode ( ListSelectionModel . SINGLE_SELECTION ) ;

JScrollPane listScrollPane = new JScrollPane ( list ) ;

JPanel topPanel = new JPanel ( ) ;
topPanel. setLayout ( new BorderLayout ( ) ) ;
topPanel. add ( listScrollPane, BorderLayout . CENTER ) ;

ActionListener updateButtonListener = new UpdateListAction ( list ) ;
updateButtonListener. actionPerformed (
new ActionEvent ( list, ActionEvent . ACTION_PERFORMED , null )
) ;

JButton updateListButton = new JButton ( «Update list» ) ;
JButton updateLookAndFeelButton = new JButton ( «Update Look&Feel» ) ;

JPanel btnPannel = new JPanel ( ) ;
btnPannel. setLayout ( new BoxLayout ( btnPannel, BoxLayout . LINE_AXIS ) ) ;
btnPannel. add ( updateListButton ) ;
btnPannel. add ( Box . createHorizontalStrut ( 5 ) ) ;
btnPannel. add ( updateLookAndFeelButton ) ;


JPanel bottomPanel = new JPanel ( ) ;
bottomPanel. add ( btnPannel ) ;

JPanel panel = new JPanel ( ) ;
panel. setBorder ( BorderFactory . createEmptyBorder ( 5 , 5 , 5 , 5 ) ) ;
panel. setLayout ( new BorderLayout ( ) ) ;
panel. add ( topPanel, BorderLayout . CENTER ) ;
panel. add ( bottomPanel, BorderLayout . SOUTH ) ;

JFrame frame = new JFrame ( «Look&Feel Switcher» ) ;
frame. setMinimumSize ( new Dimension ( 300 , 200 ) ) ;
frame. setDefaultCloseOperation ( WindowConstants . EXIT_ON_CLOSE ) ;
frame. add ( panel ) ;
frame. pack ( ) ;
frame. setVisible ( true ) ;

Цукерберг рекомендует:  Зачем нужен псевдо класс target CSS3

updateListButton. addActionListener ( updateButtonListener ) ;
updateLookAndFeelButton. addActionListener (
new UpdateLookAndFeelAction ( frame, list )
) ;
>

Тут, в общем-то, нет ничего супер сложного. Создаются кнопки, список, список заворачивается в JScrollPane, чтобы у списка была прокрутка. Элементы управления располагаются во фрейме при помощи панелей. Панели могут иметь различные лайоуты, здесь мы использовали BorderLayout и BoxLayout. Принцип аналогичен тому, что используется в wxWidgets.

Для реакции на различные события, например, нажатия кнопок, используются классы, реализующие интерфейс ActionListener. В приведенном выше коде используется два таких класса — UpdateListAction и UpdateLookAndFeelAction. Как нетрудно догадаться по названию, первый класс отвечает за обработку нажатий на левую кнопку «Update list», второй — на правую кнопку «Update Look&Feel». ActionListener’ы привязываются к кнопкам при помощи метода addActionListener. Поскольку сразу после запуска приложения нам хочется увидеть список доступных Look&Feel, мы эмулируем нажатие на кнопку «Update list». Для этого мы создаем экземпляр класса ActionEvent и передаем его в качестве аргумента методу actionPerformed класса UpdateListAction.

Реализация класса UpdateListAction следующая:

static class UpdateListAction implements ActionListener <
private JList String > list ;

public UpdateListAction ( JList String > list ) <
this . list = list ;
>

@Override
public void actionPerformed ( ActionEvent event ) <
ArrayList String > lookAndFeelList = new ArrayList <> ( ) ;
UIManager. LookAndFeelInfo [ ] infoArray =
UIManager . getInstalledLookAndFeels ( ) ;
int lookAndFeelIndex = 0 ;
int currentLookAndFeelIndex = 0 ;
String currentLookAndFeel >=
UIManager . getLookAndFeel ( ) . getClass ( ) . getName ( ) ;

for ( UIManager. LookAndFeelInfo info : infoArray ) <
if ( info. getClassName ( ) . equals ( currentLookAndFeel >) ) <
currentLookAndFeelIndex = lookAndFeelIndex ;
>
lookAndFeelList. add ( info. getName ( ) ) ;
lookAndFeelIndex ++;
>

String [ ] listDataArray = new String [ lookAndFeelList. size ( ) ] ;
final String [ ] newListData =
lookAndFeelList. toArray ( listDataArray ) ;
final int newSelectedIndex = currentLookAndFeelIndex ;

SwingUtilities . invokeLater ( new Runnable ( ) <
@Override
public void run ( ) <
list. setListData ( newListData ) ;
list. setSelectedIndex ( newSelectedIndex ) ;
>
> ) ;
>
>

В конструкторе передается указатель на список, в котором мы будет отображать доступные Look&Feel. На самом деле, поскольку UpdateListAction является вложенным классом нашего основного класса LookAndFeelSwitcher, у него есть возможность обращаться напрямую к полям создавшего его экземпляра LookAndFeelSwitcher. Но функциональщик внутри меня сопротивляется такому подходу, поэтому я решил передать ссылку на список явно через конструктор.

Метод actionPerformed будет вызываться при нажатии на кнопку. Код этого метода довольно тривиален — мы просто используем статические методы класса UIManager для получения списка доступных Look&Feel, а также определения текущего Look&Feel. Затем обновляется содержимое списка и выбранный в нем элемент. Тут нужно обратить внимание на два момента. Во-первых, каждый Look&Feel имеет имя и имя класса, это разные вещи. Пользователю мы должны показывать имена, а при переключении Look&Feel использовать имя класса. Во-вторых, обратите внимание на то, как создаются final переменные newListData и newSelectedIndex, которые затем используются в анонимном классе. Это и есть тот самый аналог замыканий, речь о котором шла ранее. Очевидно, использование не final переменных в замыканиях привело бы к печальным последствиям.

Наконец, рассмотрим класс UpdateLookAndFeelAction:

static class UpdateLookAndFeelAction implements ActionListener <
private JList String > list ;
private JFrame rootFrame ;

public UpdateLookAndFeelAction ( JFrame frame, JList String > list ) <
this . rootFrame = frame ;
this . list = list ;
>

@Override
public void actionPerformed ( ActionEvent e ) <
String lookAndFeelName = list. getSelectedValue ( ) ;
UIManager. LookAndFeelInfo [ ] infoArray =
UIManager . getInstalledLookAndFeels ( ) ;

for ( UIManager. LookAndFeelInfo info : infoArray ) <
if ( info. getName ( ) . equals ( lookAndFeelName ) ) <
String message = «Look&feel was changed to » + lookAndFeelName ;
try <
UIManager . setLookAndFeel ( info. getClassName ( ) ) ;
SwingUtilities . updateComponentTreeUI ( rootFrame ) ;
> catch ( ClassNotFoundException e1 ) <
message = «Error: » + info. getClassName ( ) + » not found» ;
> catch ( InstantiationException e1 ) <
message = «Error: instantiation exception» ;
> catch ( IllegalAccessException e1 ) <
message = «Error: illegal access» ;
> catch ( UnsupportedLookAndFeelException e1 ) <
message = «Error: unsupported look and feel» ;
>
JOptionPane . showMessageDialog ( null , message ) ;
break ;
>
>
>
>

Здесь мы просто (1) находим L&F с именем, равным имени, выбранному в списке, (2) меняем L&F при помощи static метода setLookAndFeel класса UIManager и (3) перерисовываем главный фрейм нашего UI, а также, рекурсивно, расположенные на нем элементы, при помощи static метода updateComponentTreeUI класса SwingUtilities. Наконец, мы уведомляем пользователя при помощи сообщения, все ли прошло успешно.

Также хотелось бы сказать пару слов об отладке GUI-приложений на Java, и не только GUI. Во-первых, в Swing есть такое волшебное сочетание клавиш Ctr + Shift + F1, которое выводит в stdout информацию о том, как расположены контролы. Очень полезно, если хочется слизать UI у конкурентов. Во-вторых, есть такой интересный хоткей Ctr + \. Если нажать его в консоли работающего приложения на Java, будут выведены все нитки и их стектрейсы. Удобно, если вы словили дэдлок. Наконец, в-третьих, во время разработки GUI бывает полезно разукрасить панели в разные цвета. Сделать это можно так:

Код к этой заметке вы найдете здесь. Присмотритесь к нему повнимательнее. Как по мне, код получился не таким уж и многословным или там в стиле «фабрика фабрик для создания фабрик», как любят наговаривать на Java некоторые товарищи. В принципе, все довольно просто и понятно, и выкинуть из кода особо нечего. Вы как считаете?

Java Swing Tutorial: Examples to create GUI

What is Swing?

Java Swing is a lightweight Graphical User Interface (GUI) toolkit that includes a rich set of widgets. It includes package lets you make GUI components for your Java applications, and It is platform independent.

The Swing library is built on top of the Java Abstract Widget Toolkit (AWT), an older, platform dependent GUI toolkit. You can use the Java GUI components like button, textbox, etc. from the library and do not have to create the components from scratch.

All components in swing are JComponent which can be added to container classes.

What is a container class?

Container classes are classes that can have other components on it. So for creating a GUI, we need at least one container object. There are 3 types of containers.

  1. Panel: It is a pure container and is not a window in itself. The sole purpose of a Panel is to organize the components on to a window.
  2. Frame: It is a fully functioning window with its title and icons.
  3. Dialog: It can be thought of like a pop-up window that pops out when a message has to be displayed. It is not a fully functioning window like the Frame.

Java GUI Example


Example: To learn to design GUI in Java
Step 1) Copy the following code into an editor

Step 2) Save, Compile, and Run the code.
Step 3) Now let’s Add a Button to our frame. Copy following code into an editor

Step 4) Execute the code. You will get a big button

Step 5) How about adding two buttons? Copy the following code into an editor.

Step 6) Save , Compile , and Run the program.
Step 7) Unexpected output =? Buttons are getting overlapped.

Java Layout Manger

The Layout manager is used to layout (or arrange) the GUI java components inside a container.There are many layout managers, but the most frequently used are-

Java BorderLayout

Java FlowLayout

Java GridBagLayout

It is the more sophisticated of all layouts. It aligns components by placing them within a gr >

Step 8) How about creating a chat frame like below?

Try to code yourself before looking at the program below.

Отзывы о книге

Здесь вы сможете просмотреть отзывы о книге, которые оставили ее читатели, а также сможете оставить и свой отзыв.

  • Блистательная книга! Хочется передать привет Manning и O’Reilly — у них пока нет ничего подобного. Мои поздравления автору — ему удалось написать лучшую книгу по Swing ever.
  • Не верил, что “специальную” литературу буду читать запоем, позабыв обо всем. Искренне рад, что ошибался. Методически ( от от общего к частному) книга выдержана просто блистательно. Теперь обязательно буду следить за творчеством автора.
  • Хочу сказать ОГРОМНОЕ спасибо за неоценимый труд по Swing, почерпнул оттуда очень много, для своей работы по важности ставлю Вашу книгу в один ряд с “Code Complete” Макконнелла (не сочтите за лесть).
  • Обе книги (первое и второе издание) самое лучшее, что есть из руководств по Swing. Автору огромная благодарность за его труд
  • Я книгу Ивана Портянкина про Swing зачитал до дыр. Книга просто чудесная! Лучшего описания Swing я больше нигде не видел, включая попадавшиеся мне зарубежные издания.
  • Полноценное раскрытие темы. Наверное я не ошибусь, если напишу что это основная книга на русском языке по Java Swing. Каждому разработчику десктопных UI под эту платформу желательно быть с ней знакомым.
  • Просто великолепно. Воистину — краткость — сестра таланта. Просто и методично отшлифовано. Большое спасибо. Так держать.
  • Классная книга, которая подойдет как новичкам так и профессионалам. Особую гордость испытываешь от того что эту книгу написал российский автор. Побольше бы таких книг.

Полный список глав книги

Книга покрывает все важнейшие вопросы, с которыми вы можете столкнуться при разработке приложений любой сложности в Swing. Начиная с постепенного обзора технологии как таковой, с каждой новой главой знакомство переходит в уверенное владение, а количество примеров, демонстрирующих поведение и особенности библиотеки, просто неисчислимо. Самая “горячая” особенность библиотеки, многопоточное программирование и поток рассылки событий, постоянно обсуждается, показаны основные ошибки и основные шаблоны, применяемые в Swing. Введение — краткое введение, об истории книги, благодарности и тому подобные мелочи, приятные сердцу автора.

Глава 1. Основные концепции — что лежит в основе книги, что движет изменениями в версиях, и какие решения и паттерны сделали Swing такой библиотекой, какая она есть, почему внешний вид Swing так легко изменить.

Глава 2. Модель событий. В этой главе мы увидим, как обрабатывать события в Swing, и рассмотрим основные типы событий, общие для всех графических компонентов.

Глава 3. За кулисами системы обработки событий. В этой главе мы познакомимся с «начинкой» системы обработки событий Swing и посмотрим, как она функционирует. Пульсирующее сердце Swing, непрерывно продолжающий свой бег поток рассылки событий Event Dispatch Thread оказывает свое влияние даже на самые маленькие программы Swing, и изучается в данной главе с особенным вниманием.

Глава 4. Рисование в Swing. Как только дело дойдет до первого собственного компонента или первым попыткам нарисовать что-то в Swing приложении, непременно обратитесь сюда. Эта новая глава посвящена непосредственно основам и трудностям рисования на экране в Swing, и прочитав ее вы сможете творить на экране все, не сомневаясь в происхождении любого пиксела.

Глава 5. Внутренние винтики Swing. Здесь мы ближе взглянем на некоторые внутренние механизмы библиотеки Swing, которые обычно работают как часы, однако при возникновении более сложных ситуаций требуют нашей осведомленности в них.

Глава 6. Контейнеры высшего уровня. Окна и остальные контейнеры Swing, размещающие ваши интерфейсы на экране. Особенности корневой панели, прозрачной панели, многоуровневой панели. Инструмент JXLayer, дающий некоторую власть над общим пространством окна.

Цукерберг рекомендует:  Программирование в химии интервью с Джузеппе Балакко

Глава 7. Искусство расположения. Особая глава, после которой управлять расположением компонентов намного проще. Очень много мелочей добавлено к старому материалу, добавлены новые менеджеры расположения, соображения при проектировании интерфейса, сравнение табличных и блочных стратегий, инструменты для GridBagLayout, удобный MigLayout.

Глава 8. Надписи, значки, подсказки и прочий вывод статичной информации

Глава 9. Кнопки, кнопки, и еще раз кнопки. AbstractButton и ее производные.

Глава 10. Меню и панели инструментов.

Глава 11. Списки JList и JComboBox.

Глава 12. Элементы для ограниченного выбора — ползунки, счетчики и остальные подобные компоненты.


Глава 13. Эффективное распределение пространства. Панели прокрутки, разбиение экрана и многое другое.

Глава 14. Стандартные диалоги Swing. Ввод и вывод простой информации.

Глава 15. Уход за деревьями и иерархическая информация. Дерево JTree и все его сопровождающее.

Глава 16. Все для редактирования текста, простого, со стилями, HTML, некоторые хитрости пакета работы с текстом.

Глава 17. Таблица JTable. Все новые возможности из 1.6 и 1.7, винтики и шпунтики таблиц, зачастую основных рабочих лошадок деловых приложений.

Глава 18. Круговорот данных. drag’n’drop, copy/paste, undo/redo и остальные прекрасные мелочи библиотеки для работы с данными пользователей. Объем второго издания, благодаря плотной верстке, мелкому шрифту, и приборке устаревшего материала, остались разумными — около 600 страниц, то есть практически в пределах первого издания, несмотря на большое количество нового материала, снимки экранов и другие улучшения.

Файлы к книге

Здесь можно скачать архив со всеми исходными текстами примеров из книги. Все они, как и в прошлом издании, с максимальной тщательностью проверены, а также компилируются так просто, как только возможно. Так как каждый пример очень и очень краток и прост, но тем не менее демонстрирует тот или иной аспект поведения компонента Swing или какой-либо механизм Swing, и представляет собой законченную программу, выводящую окно на экран, используйте их как заготовку, обтачивая новые знания и концепции. Практика, обточка мастерства, на таких “заготовках”, быстро компилирующихся и запускающихся, быстро дополнит ваши знания уверенностью в том, как оно на самом деле работает в реальности.

Архив представляет собой набор директорий с примерами для каждой главы. Отдельной директорией идет директория “tools”, в которой хранятся полезные инструменты и заготовки из пакета com.porty.swing, которые мы время от времени описывали в книге. Чтобы скомпилировать примеры для какой-либо главы, просто зайдите в директорию с ее номером и наберите простое как мир: javac *.java

В директории будут присутствовать все файлы, инструменты, значки и ресурсы, необходимые для запуска примеров. Далее вам остается лишь запускать нужные из них. Если вы хотите использовать что-то выглядящее более прилично чем внешний вид Swing по умолчанию, добавьте желаемый внешний вид в список доступных библиотек >

Если вы обнаружите в примерах ошибки, в архиве будет чего-либо не хватать, или что-то не будет компилироваться, сообщите мне. Заранее спасибо.

© All rights reserved. Powered by Hugo and Minimal

ЯВА СВИНГ (java swing кнопка местополжение размер текст) = простой пример программы

Primary tabs

Forums:

рассуждения по поводу решения здесь = http://fkn.ktu10.com/?q=node/2036

Чтобы проиллюстрировать создание элементарной формы в свинг создаём два класса —
первый тот, в которым мы опишем элементы управления =

второй класс (содержит в себе точку входа) является основным , создаёт фрэйм и инициаллизирует его наполнение содержимым создав сущность второго класса =

Java Swing model architecture

Swing engineers created the Swing toolkit implementing a modified Model View Controller design pattern. This enables efficient handling of data and using pluggable look and feel at runtime.

The traditional MVC pattern divides an application into three parts: a model, a view and a controller. The model represents the data in the application. The view is the visual representation of the data. And finally the controller processes and responds to events, typically user actions, and may invoke changes on the model. The idea is to separate the data access and business logic from data presentation and user interaction, by introducing an intermediate component: the controller.

The Swing toolkit uses a modified MVC design pattern. It has a single UI object for both the view and the controller. This modified MVC is sometimes called a separable model architecture.

In the Swing toolkit, every component has its model, even the basic ones like buttons. There are two kinds of models in Swing toolkit:

The state models handle the state of the component. For example the model keeps track whether the component is selected or pressed. The data models handle data they work with. A list component keeps a list of items that it is displaying.

For Swing developers it means that they often need to get a model instance in order to manipulate the data in the component. But there are exceptions. For convenience, there are some methods that return data without the need for a programmer to access the model.

An example is the getValue() method of the JSlider component. The developer does not need to work with the model directly. Instead, the access to the model is done behind the scenes. It would be an overkill to work with models directly in such simple situations. Because of this, Swing provides some convenience methods like the previous one.

To query the state of the model, we have two kinds of notifications:

  • lightweight notifications
  • stateful notifications

A lightweight notification uses a ChangeListener class. We have only one single event ( ChangeEvent) for all notifications coming from the component. For more complicated components, a stateful notification is used. For such notifications, we have different kinds of events. For example the JList component has ListDataEvent and ListSelectionEvent .

If we do not set a model for a component, a default one is created. For example the button component has a DefaultButtonModel model.


Looking at the JButton.java source file we find out that the default model is created at the construction of the component.

ButtonModel

The model is used for various kinds of buttons like push buttons, check boxes, radio boxes and for menu items. The following example illustrates the model for a JButton . We can manage only the state of the button because no data can be associated with a push button.

In our example, we have a button, a check box, and three labels. The labels represent three properties of the button: pressed, disabled, or armed state.

We use a ChangeListener to listen for button state changes.

Here we get the default button model.

We query the model whether the button is enabled. The label is updated accordingly.

The check box enables or disables the button. To enable the OK button, we call the setEnabled() method. So we change the state of the button. Where is the model? The answer lies in the AbstractButton.java file.

The answer is that internally the Swing toolkit works with a model. The setEnabled() is another convenience method for programmers.

Custom ButtonModel

In the previous example, we used a default button model. In the following code example we will use our own button model.

This example does the same thing as the previous one. The difference is that we do not use a change listener and we use a custom button model.

We set the custom model for the button.

We create a custom button model and override the necessary methods.

We override the setEnabled() method and add some functionality there. We must not forget to call the parent method as well to proceed with the processing.

JList models

Several components have two models; JList is one of them. It has the following models: the ListModel and the ListSelectionModel . The ListModel handles data and the ListSelectionModel works with the selection state of the list. The following example uses both models.

The example shows a list component and four buttons. The buttons control the data in the list component. The example is a bit larger because we did some additional checks there. For instance, we do not allow to input empty spaces into the list component.

We create a default list model and add elements into it.

We create a list component. The parameter of the constructor is the model we have created. We make the list into the single selection mode.

We add only items that are not equal to null and are not empty, e.g. items that contain at least one character other than white space. It makes no sense to add white spaces or null values into the list.

This is the code that runs when we press the Delete button. In order to delete an item from the list, it must be selected—we must figure out the currently selected item. For this, we call the getSelectionModel() method. We get the selected index with the getMinSelectionIndex() and remove the item with the remove() method.

In this example we used both list models. We called the add() , remove() , and clear() methods of the list data model to work with our data. And we used a list selection model in order to find out the selected item.

Figure: List models

A document model

A document model is a good example of a separation of a data from the visual representation. In a JTextPane component, we have a StyledDocument for setting the style of the text data.

The example has a text pane and a toolbar. In the toolbar, we have four buttons that change attributes of the text.

Here we get the styled document which is a model for the text pane component.

A style is a set of text attributes, such as colour and size. Here we register a bold style for the text pane component. The registered styles can be retrieved at any time.

Here we change the attributes of the text. The parameters are the offset and length of the selection, the style and the boolean value replace. The offset is the beginning of the text where we apply the bold text. We get the length value by substracting the selection end and selection start values. Boolean value false means that we are not replacing an old style with a new one, but we merge them. This means that if the text is underlined and we make it bold, the result is an underlined bold text.

Figure: Document model

In this chapter we have mentioned Swing models.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих