Тема 2.4. Графический интерфейс Swing языка Java

advertisement
-1Прикладное программирование в ТС
Лекция 3-07
Лекция 3-07
2.3.19. Создание меню и обработка событий в меню
2.3.20. Класс PopupMenu
2.3.21. Класс Dialog
2.3.22. Класс FileDialog
Тема 2.4. Графический интерфейс Swing языка Java
2.4.1. Основные компоненты Swing
2.4.2. Схема MVC в компонентах Swing
2.4.3. Контейнеры верхнего уровня и специализированные контейнеры
2.4.3.1. Корневая панель
2.4.3.2. Слоистая панель
2.4.3.3. Панель содержимого
2.4.3.4. Стеклянная панель
2.4.3.5. Класс JFrame
2.4.3.6. Диалоговые окна
2.4.3.7. Классы JInternalFrame и JDesktopPane
2.4.4. Общецелевые контейнеры
2.4.4.1. Класс JPanel
2.4.4.2. Классы JScrollPane и Viewport
2.4.4.3. Класс JTabbedPane
2.4.4.4. Класс JSplitPane
2.4.4.5. Класс JToolBar
2.4.5. Значки, надписи и кнопки
2.4.5.1. Интерфейс Icon и класс ImageIcon
2.4.5.2. Класс JLabel
2.4.5.3. Класс AbstractButton
2.4.5.4. Класс JButton
2.4.6. Флажки и переключатели
2.3.19. Создание меню и обработка событий в меню
С фреймами тесно связан компонент Меню (Menu). Основные компоненты меню
представлены на рис. 3.25.
Рис. 3.25. Основные компоненты меню в AWT Java
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-2Прикладное программирование в ТС
Лекция 3-07
Чтобы у фрейма появилось раскрывающееся меню, с фреймом следует связать
объект класса MenuBar. Он создается конструктором
public MenuBar(),
например:
MenuBar myMenuBar = new MenuBar();
Создав строку меню, ее можно добавить в фрейм, обратившись к методу
public void setMenuBar(MenuBar mb)
класса Frame, например
myFrame.setMenuBar(myMenuBar);
Раскрывающиеся меню являются объектами класса Menu и добавляются к объекту
класса MenuBar с помощью метода
public Menu add(Menu newMenu)
класса MenuBar, например, следующий фрагмент программы создает меню File и
добавляет его к объекту класса MenuBar:
Menu fileMenu = new Menu("File");
myMenuBar.add(fileMenu);
Текущее количество меню в объекте класса MenuBar можно получить с помощью
метода
public int getMenuCount(),
а метод
public Menu getMenu(int i)
позволяет получить меню с заданным индексом i (меню индексируются в порядке их
добавления к строке меню, начиная с индекса 0).
Удаление меню с заданным индексом выполняется с помощью метода класса
MenuBar
public void remove(int index).
Конструкторы класса Menu:
public Menu()
public Menu(String label)
определяют соответственно меню без наименования и меню с заданным наименованием
label.
Некоторые оконные системы позволяют создавать меню, которые остаются на
экране после того, как кнопка мыши отпущена. Такие меню называются отрывными
меню (tear-off menu). При создании меню можно указать, что оно должно вести себя как
отрывное с помощью третьего конструктора класса Menu:
public Menu(String menuLabel, boolean allowTearoff)
Проверка, является ли меню отрывным, выполняется с помощью метода
public boolean isTearOff().
Следует отметить, что отрывное меню не функционирует на платформе Windows.
В каждом добавленном меню можно определять команды или пункты меню.
Пункт меню (menu item) — это элемент меню, который выбирает пользователь. Меню
может содержать отдельные пункты, а также подменю. Пункт меню можно задать либо
как объект класса String, либо как объект класса MenuItem. В первом случае можно
добавить пункт в конец меню с помощью метода
public void add(String label),
класса Menu, например:
fileMenu.add("Open"); // Добавить пункт "Open" (Открыть)
Объект класса MenuItem добавляется в меню с помощью метода
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-3Прикладное программирование в ТС
Лекция 3-07
public MenuItem add(MenuItem mi).
Класс Menu, помимо метода isTearOff() и перегружаемых методов add(),
содержит следующие основные методы:
 public int getItemCount() – получение количества пунктов в данном
меню;
 public MenuItem getItem(int index) – получение значения элемента
по заданному индексу;
 public MenuItem insert(String label, int index), void
insert(String label, int index) – вставка пункта меню с заданным индексом;
 public void remove(int index) и public void removeAll() –
удаление пункта меню с заданным индексом и удаление всех пунктов меню;
 public
void
addSeparator()
и
public
void
insertSeparator(int index) – вставка разделителя (горизонтальной черты) между
пунктами меню.
Вставить разделитель между пунктами меню можно также, задав в качестве текста
для пункта меню строку "-".
В классе MenuItem определены следующие конструкторы:
MenuItem()
MenuItem(String label)
MenuItem(String label, MenuShortcut s)
Первый конструктор задает пункт меню без текста. Второй конструктор задает
пункт меню с заданным текстом, а третий конструктор дополнительно задает во втором
параметре «горячие», или «быстрые», клавиши (shortcuts), которые позволяют выбрать
пункт меню при нажатии этих клавиш.
Конструкторы класса MenuShortcut:
public MenuShortcut(int key)
public MenuShortcut(int key, boolean useShiftModifier)
позволяют задать «горячие» клавиши (второй конструктор дополнительно задает реакцию
на одновременное нажатие клавиши key и клавиши Shift, т.е. различать ли нажатие
данной клавиши в верхнем или нижнем регистре). В качестве значения key задаются
значения полей класса KeyEvent, например, задание VK_1 означает нажатие клавиш
Ctrl+1, VK_Z означает нажатие клавиш Ctrl+Z и т.д.
Пример задания пункта меню с использованием объектов классов MenuItem и
MenuShortcut:
// Создать пункт меню "Save" (Сохранить)
MenuItem saveMenuItem =
new MenuItem("Save", new MenuShortcut(KeyEvent.VK_S));
// Добавить пункт в меню
fileMenu.add(saveMenuItem);
В классе MenuItem определены следующие основные методы:
 public String getLabel() и public void setLabel(String
label) – получение текста пункта меню и установка текста пункта меню;
 public boolean isEnabled() и public void setEnabled(boolean
b) – проверка является ли пункт меню недоступными (disabled) и доступными (enabled) и
установка доступности или недоступности пункта меню;
 public
MenuShortcut
getShortcut(),
public
void
setShortcut(MenuShortcut s) и public void deleteShortcut() –
получение, установка и удаление «горячей» клавиши;
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-4Прикладное программирование в ТС
Лекция 3-07
 public
String
getActionCommand()
и
public
void
setActionCommand(String command) – получение и установка имени команды
события action для пункта меню (по умолчанию имя команды совпадает с текстом пункта
меню).
Кроме отдельных пунктов и элементов-разделителей, можно также добавлять в
меню подменю (submenu).
Чтобы добавить подменю, достаточно создать новое меню и добавить его в
существующее меню, например:
// Создание подменю Print
Menu printSubmenu = new Menu("Print");
// Добавление подменю Print в меню File
fileMenu.add(printSubmenu);
// Добавление в подменю Print пункта Print Preview
printSubmenu.add("Print Preview");
// Добавление в подменю Print пункта Print Document
printSubmenu.add("Print Document");
Помимо обычных пунктов меню, можно создавать пункты меню с флажком
(checkbox menu item). Такие пункты меню действуют аналогично флажкам. Когда пункт
выбран первый раз, он становится включенным. В следующий раз при выборе пункт
становится выключенным. Для создания пунктов меню с флажком используется
отдельный класс CheckboxMenuItem. В этом классе определены три конструктора:
CheckboxMenuItem()
CheckboxMenuItem(String itemLabel)
CheckboxMenuItem(String itemLabel, boolean state)
Первый конструктор задает пункт меню с флажком без текста, второй – пункт
меню с флажком с текстом, а третий дополнительно задает первоначальное состояние
флажка – true (включен) или false (выключен).
Метод
public boolean getState()
класса CheckboxMenuItem возвращает true, если данный пункт включен, а состояние
пункта можно изменить при помощи метода
public void setState(boolean newState).
Как правило, меню добавляются в главное меню слева направо. В то же время, во
многих оконных системах предусмотрена возможность создавать специальное меню
"Справка"("Help"), расположенное в главном меню справа. Такое меню можно
добавить, используя метод
public void setHelpMenu(Menu helpMenu).
Меню генерирует события только тогда, когда выбираются пункты меню. Однако
добавление блоков прослушивания и обработку событий можно задавать как для меню,
так и для отдельных пунктов меню, поскольку методы включения и удаления блоков
прослушивания
addActionListener(ActionListener l)
и
removeActionListener(ActionListener l)
определены как в классе Menu, так и в классе MenuItem.
Обработка события, связанного с выбором меню или пункта меню выполняется с
помощью метода
public void actionPerformed(ActionEvent e)
в интерфейсе ActionListener. Метод
public String getActionCommand()
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-5Прикладное программирование в ТС
Лекция 3-07
класса KeyEvent позволяет получить имя команды, вызвавшей событие (это может быть
либо строка текста пункта меню, либо строка, заданная в методе setActionCommand()
класса MenuItem). Меню (в том случае, если блок прослушивания добавлен для всего
меню, а не для отдельного пункта меню) можно получить, используя метод класса
EventObject
public Object getSource().
Однако следует отметить, что события в пунктах меню класса
CheckboxMenuItem обрабатываются как события класса ItemEvent, т.е. для них надо
добавлять или удалять блоки прослушивания с помощью методов
addItemListener(ItemListener l)
и
removeItemListener(ItemListener l).
Обработка события в этом случае выполняется с помощью метода
public void itemStateChanged(ItemEvent e).
Пункт меню, вызвавший событие, можно получить с помощью метода
public Object getItem(),
а состояние флажка – включен (SELECTED) или выключен (DESELECTED) определяется с
помощью метода
public int getStateChange()
класса ItemEvent.
Пример использования меню с обработкой событий выбора пункта меню (вывод
наименований меню и команды, а для команд типа CheckBox – изменения состояния)
приведен на рис. 3.26.
Рис. 3.26. Пример использования меню в AWT
2.3.20. Класс PopupMenu
Меню, созданное с помощью класса PopupMenu («всплывающее» меню) работает
точно так же, как и обычное меню, но выводится при щелчке мышью в какой-либо точке
окна фрейма (возможно при выполнении заданных условий). В Windows такого рода
меню называется контекстным меню (shortcut menu) и вызывается щелчком правой
кнопки мыши.
Для класса PopupMenu определены конструкторы
public PopupMenu()
public PopupMenu(String label),
задающие соответственно меню без имени и меню с заданным именем.
Поскольку класс PopupMenu является подклассом класса Menu, он наследует все
перечисленные выше методы класса Menu, в том числе и для манипуляций с объектами
классов MenuItem и CheckboxMenuItem. В классе добавлен метод
public void show(Component origin, int x, int y),
показывающий «всплывающее» меню в точке с координатами x и y относительно
компонента origin.
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-6Прикладное программирование в ТС
Лекция 3-07
Поскольку «всплывающее» меню обычно появляется в окне при щелчке мышью,
необходимо использовать блоки прослушивания мыши, добавляемые и удаляемые с
помощью методов
addMouseListener(MouseListener l)
и
removeMouseListener(MouseListener l).
Для обработки событий, связанных с появлением окна, необходимо описать
необходимые методы класса MouseAdapter,например,
public void mouseClicked(MouseEvent e)
для объекта класса PopupMenu.
Метод класса KeyEvent
public boolean isPopupTrigger()
определяет является ли событие изменением состояния переключателя для всплывающего
меню в данной компьютерной платформе (в Windows это нажатие правой кнопки мыши),
а методы
public int getX()
public int getY()
позволяют получить координаты x и y указателя мыши для данного события.
Обработка событий выбора обычных пунктов меню и меню с флажками
производится точно также, как и в обычном меню.
Пример всплывающего меню (выводится при нажатии кнопки на экране или
правой кнопки мыши) приведен на рис. 3.27.
Рис. 3.27. Пример всплывающего меню
2.3.21. Класс Dialog
Диалоговые окна (Dialogs) представляют собой раскрывающиеся окна, которые
не настолько универсальны, как фреймы. Можно создать модальное (modal) и
немодальное (non-modal) диалоговое окно. Если на экране появилось модальное
диалоговое окно, ввод в другие окна временно запрещается. Это полезно при создании
диалогов, требующих ответа на принципиальный вопрос, такой как "Завершить работу?".
Примером немодального диалога может служить панель управления, которая изменяет
некоторые параметры приложения, в то время как программа продолжает выполняться.
Чтобы создать диалоговое окно, необходимо иметь фрейм. Диалоговое окно не
может принадлежать непосредственно апплету, но апплет может создать фрейм, а затем
диалоговое окно.
Диалоговое окно создается с помощью одного из следующих конструкторов:
public Dialog(Dialog parentDialog);
public Dialog(Dialog parentDialog, String title);
public Dialog(Dialog parentDialog, String title,
boolean isModal)
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-7Прикладное программирование в ТС
Лекция 3-07
public Dialog(Frame parentFrame);
public Dialog(Frame parentFrame, String title);
public Dialog(Frame parentFrame, boolean isModal)
Параметры parentDialog или parentFrame задают имя родительского
диалогового окна или фрейма для данного диалогового окна, параметр title задает имя
окна диалога, а параметр isModal указывает, должен ли он быть модальным или нет,
например:
Dialog myDialog = new Dialog(myFrame, "My Dialog", true);
После создания можно сделать диалоговое окно видимым, обратившись к методу
public void show()
класса Dialog, а спрятать (сделать невидимым) диалоговое окно можно с помощью
метода
public void hide()
класса Dialog, например:
myDialog.show();
Закрытие окна выполняется с помощью метода класса Dialog
public void dispose().
Методы
public String getTitle()
public void setTitle()
позволяют соответственно получить и установить имя окна диалога, а методы
public boolean isModal()
public void setModal(boolean b)
соответственно определяют и устанавливают режим окна (модальный или немодальный).
Кроме того, в классе Dialog определены методы
public boolean isResizable()
public void setResizable(boolean resizable).
Первый из этих методов проверяет, а второй задает возможность изменения
размеров диалогового окна.
Диалоговые окна могут генерировать следующие события окна: WINDOW_OPENED,
WINDOW_CLOSING, WINDOW_CLOSED, WINDOW_ACTIVATED.
Пример диалогового окна для ввода строк текста приведен на рис. 3.28.
Рис. 3.28. Пример диалогового окна
2.3.22. Класс FileDialog
В состав AWT включен класс FileDialog, который обеспечивает встроенное
диалоговое окно, позволяющее выбрать определенный файл. По форме это стандартное
модальное диалоговое окно, используемое операционной системой для открытия файлов.
После выбора файла или нажатия кнопки Cancel файловое диалоговое окно
автоматически закрывается.
Для открытия этого окна достаточно создать объект класса FileDialog с
помощью одного из следующих конструкторов:
FileDialog(Frame parent)
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-8Прикладное программирование в ТС
Лекция 3-07
FileDialog(Frame parent, String title)
FileDialog(Frame parent, String title, int mode)
Параметр parent задает родительский фрейм, параметр title – имя файлового
диалогового окна, а параметр mode – режим диалогового окна. Если mode имеет значение
FileDialog.LOAD, то окно выбирает файл для чтения, если FileDialog.SAVE – то
для записи (с целью сохранения).
Методы
public int getMode()
public void setMode(int mode)
позволяют узнать или установить значение режима для файлового диалогового окна.
Метод
public String getFile()
получает имя выбранного в файловом диалоговом окне файла, а метод
public void setFile(String file)
задает указанный в параметре файл в качестве выбранного.
Метод
public String getDirectory()
получает имя каталога, в котором находится выбранный файл, а метод
public void setDirectory(String dir)
позволяет установить каталог для выбора файла.
Пример использования диалогового окна выбора файла приведен на рис. 3.29.
Рис. 3.29. Пример использования диалогового окна выбора файла
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-9Прикладное программирование в ТС
Лекция 3-07
Тема 2.4. Графический интерфейс Swing языка Java
2.4.1. Основные компоненты Swing
Для использования языка Java в различных предметных областях фирмой Sun была
разработана группа пакетов с общим именем JFC – Java Foundation Classes (базовые
классы Java).
В JFC включены следующие компоненты:
 облегченные компоненты графического интерфейса пользователя (кодовое
название Swing);
 модель делегирования событий;
 дополнительные функции печати;
 средства обмена данными с буфером обмена Clipboard;
 улучшенные средства интеграции с системой цветопередачи;
 поддержка операций, выполняемых без участия мыши;
 поддержка операции "перетащить и опустить" (drag-and-drop);
 поддержка специальных функций, предназначенных для людей с
ограниченными возможностями;
 улучшенные операции двухмерной графики.
В настоящее время Sun включила многие из функций JFC непосредственно в
базовые возможности языка Java (в частности, модель делегирования событий).
Поскольку практически во всех современных программах используется
графический интерфейс, в настоящем разделе рассматривается компонента JFC, обычно
называемая пакетом или системой Swing (остальные компоненты JFC, кроме
рассмотренной ранее модели делегирования событий, носят более специальный характер
и не рассматриваются в данной книге).
Как уже указывалось ранее, каждый компонент AWT в среде Java должен быть
связан с соответствующим ему объектом (peer-объектом) графического интерфейса
пользователя в той операционной системы, в которой выполняется программа, написанная
на языке Java, т.е. программа, выполняющаяся в среде Windows, будет иметь графический
интерфейс Windows и та же программа, выполняющаяся в среде Unix, будет иметь
графический интерфейс этой версии Unix.
Графические объекты, создаваемые с использованием Swing, не нуждаются в
создании вспомогательных объектов. Вместо создания парного компонента в среде
операционной системы компьютера они обращаются к библиотеке классов модуляприложения, соответствующего затребованному стилю представления компонента.
Поэтому пользовательский интерфейс Swing не зависит от операционной системы, под
управлением которой работает Java, и его можно менять по желанию пользователя.
Компоненты Swing входят в Java в составе группы пакетов с префиксом
javax.swing, но многие из них являются потомками компонентов пакета java.awt.
Структуру компонент системы Swing можно условно разбить на две части. Первая
часть содержит компоненты с теми же функциями, что и компоненты AWT (рис. 4.1).
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 10 Прикладное программирование в ТС
Лекция 3-07
C
Coom
mppoonneenntt
JJC
Coom
mppoonneenntt
JJC
Coom
mbbooBBooxx
JJSSccrroollllB
Baarr
JJPPaanneell
JJA
AbbssttrraaccttBBuuttttoonn
JJTToogggglleeBBuuttttoonn
JJBBuuttttoonn
JJSSccrroolllPPaannee
JJPPooppuuppM
Meennuu
JJM
MeennuuIItteem
m
JJM
MeennuuBBaarr
JJTTeexxttC
Coom
mppoonneenntt
JJEEddiittoorrPPaannee
JJTTeexxttA
Arreeaa
JJTTeexxttPPaannee
JJR
RaaddiiooBBuuttttoonn
JJC
ChheecckkBBooxx
JJC
ChheecckkBBooxxM
MeennuuIItteem
m
JJM
Meennuu
JJLLaabbeell
JJLLiisstt
JJTTeexxttFFiieelldd
JJPPaassssw
woorrddFFiieelldd
JJR
RaaddiiooBBuuttttoonnM
MeennuuIItteem
m
Рис. 4.1. Классы графического интерфейса Swing,
выполняющие те же функции, что и компоненты AWT
Вторую ветвь образуют компоненты, которые отсутствуют в AWT (рис. 4.2).
Компоненты Swing можно разделить на следующие типы:
 контейнеры верхнего уровня (классы JWindow, JFrame, JDialog и
JApplet);
 специализированные контейнеры (классы JInternalFrame, JLayeredPane,
JRootPane и JOptionPane);
 общецелевые контейнеры (классы JPanel, JScrollPane, JSplitPane,
JTabbedPane и JToolBar);
 компоненты управления (классы JButton, JCheckBox, JRadioButton,
JToggleButton,
JComboBox,
JList,
JMenuBar,
JMenu,
JMenuItem,
JCheckboxMenuItem, JRadioButtonMenuItem, JSeparator и JSlider);
 нередактируемые
информационные
компоненты
(классы
JLabel,
JProgressBar и JToolTip);
 редактируемые информационные компоненты (классы JColorChooser,
JFileChooser, JTable, JTree, JTextField, JPasswordField, JTextArea,
JEditorPane и JTextPane).
В отличие от компонентов AWT, компоненты системы Swing способны работать
только по модели делегирования событий.
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 11 Прикладное программирование в ТС
Лекция 3-07
C
Coom
mppoonneenntt
C
Coonnttaaiinneerr
JJC
Coom
mppoonneenntt
JJC
CoolloorrC
Chhoooosseerr
JJIInntteerrnnaallFFrraam
mee
JJFFiilleeC
Chhoooosseerr
JJO
OppttiioonnPPaannee
JJPPrrooggrreessssBBaarr
JJSSpplliittPPaannee
JJV
Viieew
wppoorrtt
JJTTrreeee
JJTToooollBBaarr
JJTToooollTTiipp
JJSSlliiddeerr
JJTTaabbllee
JJSSppiinnnneerr
JJTTaabbbbeeddPPaannee
JJSSeeppaarraattoorr
JJPPooppuuppM
MeennuuSSeeppaarraattoorr
JJR
RoooottPPaannee
JJTToooollBBaarrSSeeppaarraattoorr
JJLLaayyeerreeddPPaannee
JJiinntteerrnnaallFFrraam
mee..D
DeesskkttooppIIccoonn
JJD
DeesskkttooppPPaannee
Рис. 4.2. Классы графического интерфейса Swing, отсутствующие в AWT
2.4.2. Схема MVC в компонентах Swing
Схема MVC (Model-View-Controller – Модель-Вид-Контроллер) является одним из
шаблонов (способов) проектирования, разработанным для графических программ. В
этой схемы компоненты (модули) разбиваются на три по возможности независимых
компонента: модель данных, интерфейс пользователя и управляющую компоненту.
Взаимодействие этих компонент представлено на рис. 4.3 (сплошными стрелками
представлены связи по управлению, пунктирными – связи по данным).
Контроллер
Вид
Модель
Рис. 4.3. Взаимодействия компонент схемы MVC
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 12 Прикладное программирование в ТС
Лекция 3-07
Компонент «Модель» предоставляет данные для компонента «Вид» и управляет
компонентом «Контроллер», изменяя свое состояние в ответ на его запросы.
Компонент «Вид» предоставляет графический интерфейс для пользователя,
получая данные от компонента «Модель».
Компонент «Контроллер» обрабатывает данные, введенные пользователем с
помощью компонента «Вид», и управляет функционированием компонентов «Модель» и
«Вид».
В Java компонент «Модель» представляется классами, определяющими
представление данных, а также сведения о текущем состоянии этих данных. Кроме того, в
этих классах заданы методы ввода и изменения данных.
В компоненте «Вид» задаются классы, определяющие вид представления данных
на определенном устройстве (например, дисплее или печати). Для одной модели может
быть задано несколько видов представления для разных устройств. В компоненте «Вид»
задаются методы для получения данных от компонента «Модель».
В компоненте «Контроллер» задаются классы, организующие ввод данных и
изменения состояния объекта. Эти классы реагируют на различные события,
генерируемые пользователем или системой и обращаются к методам компонент «Вид» и
«Модель» для получения или изменения данных. Один и тот же компонент «Модель»
может использоваться разными компонентами «Контроллер».
В библиотеке Swing компоненты «Модель» описаны с помощью интерфейсов, в
которых задаются методы, необходимые для функционирования модели. Для того, чтобы
облегчить программирование, для каждого интерфейса существует хотя бы один класс,
реализующий данный интерфейс. Так интерфейс TableModel для модели, описывающей
таблицу, реализован в классе DefaultTableModel, а интерфейс ButtonModel для
модели, описывающей кнопку, реализован в двух классах: DefaultButtonModel и
JToggleButton.ToggleButtonModel.
В большинстве случаев при программировании графического приложения
используются уже имеющиеся в библиотеке Swing классы моделей. Для задания
собственной модели необходимо создать собственный класс, либо реализующий
соответствующий интерфейс для модели, либо являющийся наследником одного из
существующих классов моделей.
2.4.3. Контейнеры верхнего уровня и специализированные контейнеры
В отличие от остальных компонент Swing, классы JWindow, JFrame, JDialog и
JApplet являются подклассами соответственно классов Window, Frame, Dialog и
Applet, а не JComponent (поэтому они не показаны на приведенных выше рисунках).
По этой причине интерфейс пользователя, реализуемый объектами данных классов,
зависит от операционной системы, под управлением которой выполняется программа на
языке Java.
Так же, как и для AWT, для создания окон графических приложений используется
не класс JWindow, а класс JFrame (окна, создаваемые классом JWindow не содержат
наименования окна и кнопок управления окном). Приложения с графическим
интерфейсом использует, по крайней мере, один фрейм. Апплеты также могут
использовать фреймы.
Для создания окон, которые зависят от другого окна (например, исчезают, когда
сворачивается окно, в котором они используются) применяются диалоговые окна класса
JDialog.
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 13 Прикладное программирование в ТС
Лекция 3-07
Апплеты, использующие компоненты Swing, должны быть подклассами класса
JApplet. В апплетах Swing можно использовать все графические компоненты Swing,
включая меню.
Любая программа, которая использует компоненты Swing, содержит, по крайней
мере, один контейнер верхнего уровня. Этот контейнер является корнем иерархии
контейнеров, содержащих все компоненты Swing.
Как правило, отдельное графическое приложение имеет, по крайней мере, одну
иерархию контейнеров, в которой корнем является JFrame. Диалоговое окно или апплет
также образуют иерархию контейнеров, корнем которой является JDialog или
JApplet. Например, если приложение содержит одно главное окно и два диалоговых
окна, то она содержит три иерархии контейнеров.
2.4.3.1. Корневая панель
Каждый контейнер верхнего уровня базируется на промежуточном, скрытом,
контейнере, называемом корневой панелью (root pane). Корневая панель определена в
классе JRootPane. Для получения и установки корневой панели можно использовать
методы
public JRootPane getRootPane()
и
protected void setRootPane(JRootPane root)
Эти методы определены в классах JComponent, JWindow, JFrame, JDialog,
JApplet и JInternalFrame.
Сама корневая панель обычно не используется, а используются ее компоненты,
которые корневая панель (класс) предоставляет фрейму (или другому контейнеру
верхнего уровня). На рис. 4.4 представлена корневая панель и ее компоненты.
JFrame
JRootPane
JLayeredPane
JMenuBar
Content Pane
Glass Pane
Рис. 4.4. Корневая панель Swing
Корневая панель содержит следующие компоненты:
 слоистая панель (layered pane);
 панель содержимого (content pane);
 строка меню (menu bar) – необязательный компонент;
 стеклянная панель (glass bar).
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 14 Прикладное программирование в ТС
Лекция 3-07
2.4.3.2. Слоистая панель
Слоистая панель служит для позиционирования панели содержимого и строки
меню. Кроме того, она обеспечивает позиционирование панелей по оси z, т.е. компоненты,
формируемые с помощью слоистой панели, могут полностью или частично перекрывать
друг друга.
В пакете Swing определены два класса слоистых панелей: JLayeredPane и
JDesktopPane.
В слоистой панели, задаваемой с помощью класса JLayeredPane, слой, в
котором располагается та или иная панель, задается с помощью индекса (объекта класса
Integer). В табл.4.1 приведены имена, значения и описания для статических свойств
класса JLayeredPane, используемых приложениями и апплетами Swing.
Таблица 4.1. Статические свойства класса JLayeredPane
Имя свойства
Значение
Описание
FRAME_CONTENT_LAYER
new
Используется для
Integer(-30000)
позиционирования панели
содержимого и строки меню.
DEFAULT_LAYER
new Integer(0)
Если индекс слоя не задается
явно, большинство компонент
позиционируются в этом слое.
PALETTE_LAYER
new Integer(100) В этом слое позиционируются
плавающие подсказки и палитры.
MODAL_LAYER
new Integer(200) В этом слое располагаются
модальные диалоговые окна.
POPUP_LAYER
new Integer(300) В этом слое позиционируются
всплывающие (контекстные
меню).
DRAG_LAYER
new Integer(400) В этом слое выполняется
перемещение выделенного
(захваченного) компонента. При
отпускании компонента он
возвращается на свой слой.
Слоистая панель создается с помощью конструктора JLayeredPane(),
например:
JLayeredPane layeredPane = new JLayeredPane();
Для объектов классов JFrame, JDialog, JApplet и JInternalFrame
слоистую панель можно получить с помощью метода:
public JLayeredPane getLayeredPane()
Этот метод определен во всех указанных классах.
Методы класса Component
void add(Component comp)
void add(Component comp, Integer layer)
void add(Component comp, Integer layer, int pos)
добавляют компонент к слоистой панели. Аргумент layer задает индекс слоя панели
(если не задан, добавление выполняется к слою с индексом 0), аргумент pos задает
позицию аргумента внутри слоя (если не задан, компонент добавляется под всеми
другими компонентами данного слоя).
Методы
void setLayer(Component comp, int layer)
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 15 Прикладное программирование в ТС
Лекция 3-07
void setLayer(Component comp, int layer, int pos)
изменяет слой для компонента (аргументы layer и pos имеют тот же смысл, что и для
методов добавления компонента), а методы
int getLayer(Component comp)
int getLayer(JComponent comp)
получают индекс слоя для компонента comp.
Методы
int getComponentCountInLayer(int layer)
Component[] getComponentsInLayer(int layer)
int highestLayer()
int lowestLayer()
соответственно получают количество компонент для слоя, массив всех компонент слоя,
индекс самого верхнего или самого нижнего из используемых слоев.
Методы
void setPosition(Component comp, int pos)
и
int getPosition(Component comp)
соответственно устанавливают и получают позицию компонента в заданном слое, а
методы
void moveToFront(Component comp)
и
void moveToBack(Component comp)
соответственно устанавливают заданный компонент перед слоем или за слоем.
Пример использования слоистой панели для выбора слоя, перед которым будет
расположено изображение, приведен на рис. 4.5.
Рис. 4.5. Пример использования слоистой панели
2.4.3.3. Панель содержимого
Панель содержимого содержит все компоненты Swing (кнопки, надписи,
текстовые поля и т.д.). Поскольку для контейнеров верхнего уровня содержимое окна
определяется с помощью JRootPanel и должно, в отличие от окон AWT, определяться
вручную, для добавления компонент или установки менеджера компоновки используются
не методы add() и setLayout(), а методы получения и установки панели
содержимого:
public Container getContentPane()
и
public void setContentPane(Container contentPane),
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 16 Прикладное программирование в ТС
Лекция 3-07
которые определены в классах JFrame, JDialog, JApplet и JInternalFrame.
Так, добавление текстового поля во фрейм, диалоговое окно, апплет или
внутренний фрейм с установкой менеджера компоновки FlowLayout выглядит
следующим образом:
Container contentPane = getContentPane();
JTextField inputField = new JTextField(15);
contentPane.setLayout(new FlowLayout());
contentPane.add(inputField);
Следует отметить, что для всех контейнеров верхнего уровня (включая JApplet)
менеджером компоновки по умолчанию является BorderLayout.
К контейнеру верхнего уровня может быть добавлена строка меню (menu bar).
Строка меню также располагается внутри главного контейнера, но за пределами панели
содержимого. Работа с меню в Swing будет рассмотрена ниже.
2.4.3.4. Стеклянная панель
Стеклянная панель обычно используется, когда необходимо перехватывать
события над областью, которая содержит один компонент или несколько компонентов.
Например, для области, состоящей из нескольких компонент, можно отключить события
мыши, организовав перехват событий стеклянной панелью, или вывести изображения
поверх компонент.
В классах JFrame, JDialog, JApplet и JInternalFrame определены
следующие методы получения и установки стеклянной панели:
public Container getGlassPane()
и
public void setGlassPane(Container glassPane).
Пример использования стеклянной панели приведен на рис. 4.6. На рис. 4.6а
стеклянная панель отключена, и нажатие кнопки обрабатывается. На рис. 4.6б, при
включении стеклянной панели нажатие на кнопку не приводит ни к каким действием (для
наглядности стеклянная панель отображается красным кружком в позиции щелчка мыши).
а)
б)
Рис. 4.6. Пример использования стеклянной панели: а) стеклянная панель отключена;
б) стеклянная панель включена
2.4.3.5. Класс JFrame
Фрейм в Swing создается с помощью конструкторов
JFrame()
или
JFrame (String name)
где name – имя фрейма.
Для фрейма можно использовать приведенные выше методы получения и
установки корневой панели, слоистой панели, панели содержимого, строки меню и
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 17 Прикладное программирование в ТС
Лекция 3-07
стеклянной панели, причем должно быть получено, по крайней мере, значение панели
содержимого.
Другим отличием JFrame от Frame является наличие у JFrame свойства,
определяющего операцию закрытия окна по умолчанию. Для Frame по умолчанию
ничего не происходит, если делается попытка закрыть окно, а JFrame закрывается.
Метод
public void setDefaultCloseOperation(int operation)
класса JFrame позволяет определить три операции, которые могут выполняться при
закрытии окна JFrame:
 DO_NOTHING_ON_CLOSE – ведет себя так же, как AWT Frame;
 HIDE_ON_CLOSE – поведение по умолчанию (для того, чтобы окно снова
появилось на экране, необходимо использовать метод setVisible(true);
 DISPOSE_ON_CLOSE – окно закрывается.
Внешний вид фрейма в Swing не отличается от внешнего вида фрейма в AWT,
приведенного на рис. 3.8.
2.4.3.6. Диалоговые окна
Диалоговые окна можно создавать либо с помощью класса JDialog, либо
используя класс JOptionPane.
Основными конструкторами класса JDialog являются:
JDialog();
JDialog(Dialog owner)
JDialog(Dialog owner, boolean modal)
JDialog(Dialog owner, String title)
JDialog(Dialog owner, String title, boolean modal)
JDialog(Frame owner)
JDialog(Frame owner, boolean modal)
JDialog(Frame owner, String title)
JDialog(Frame owner, String title, boolean modal)
Первый конструктор создает немодальное диалоговое окно без имени. Параметры
owner, title и modal в остальных конструкторах задают соответственно родителя
данного диалогового окна, имя окна и окна (true – модальное окно или false –
немодальное окно).
Окно класса JDialog имеет те же черты, что JFrame и прямое использование
объектов класса JDialog аналогично прямому использованию объекта JFrame.
Класс JOptionPane облегчает вывод стандартных диалоговых или
информационных окон.
Для класса JOptionPane определены следующие основные конструкторы:
JOptionPane();
JOptionPane(Object message, int messageType,
int optionType, Icon icon, Object[] options,
Object initialValue);
Кроме этого определены конструкторы, содержащие соответственно только
первый параметр, только первые два параметра, только первые три параметра, только
первые четыре параметра, только первые пять параметров второго конструктора.
Все использования этого класса обычно сводятся к вызову одного из его методов:
 static int showConfirmDialog(Component parentComponent,
Object message, String title, int optionType, int messageType,
Icon icon) – задает вопрос на который требуется ответ типа Yes, No или Cancel.
Существуют также следующие три метода showConfirmDialog(): метод, содержащий
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 18 Прикладное программирование в ТС
Лекция 3-07
первые два параметра, метод, содержащий первые четыре параметра и метод, содержащий
первые пять параметров, приведенного выше метода;
 static Object showInputDialog(Component parentComponent,
Object message, String title, int messageType, Icon icon,
Object[] selectionValues, Object initialValue) – позволяет ввести
некоторый текст. Существуют также следующие пять методов showInputDialog():
метод, содержащий второй параметр, метод, содержащий второй и седьмой параметры,
метод, содержащий первые два параметра, метод, содержащий первый, второй и седьмой
параметры, и метод, содержащий первые три параметра и седьмой параметр;
 static void showMessageDialog(Component parentComponent,
Object message, String title, int messageType, Icon icon) –
позволяет вывести некоторое сообщение. Существуют также следующие два метода
showMessageDialog: метод, содержащий первые два параметра и метод, содержащий
первые четыре параметра;
 static int showOptionDialog(Component parentComponent,
Object message, String title, int optionType, int messageType,
Icon icon, Object[] options, Object initialValue) – объединяет
функции перечисленных выше диалоговых окон.
Параметры в приведенных конструкторах и методах имеют следующий смысл:
 parentComponent – определяет компонент, являющийся родителем данного
диалогового окна (если этот параметр равен null, в качестве родителя предполагается
фрейм по умолчанию);
 message – описательное сообщение, помещаемое в диалоговое окно (следует
иметь в виду, что это объект класса Object);
 selectionValues – массив объектов, рассматриваемый как набор сообщений;
 icon – изображение, выводимое в диалоге (значение по умолчанию
определяется значением параметра messageType);
 messageType – определяет тип сообщения. Допустимы следующие значения:
ERROR_MESSAGE,
INFORMATION_MESSAGE,
WARNING_MESSAGE,
QUESTION_MESSAGE и PLAIN_MESSAGE;
 optionType – определяет набор кнопок, которые будут выведены в нижней
части
диалогового
окна:
DEFAULT_OPTION,
YES_NO_OPTION,
YES_NO_CANCEL_OPTION и OK_CANCEL_OPTION
 options – более детальное описание набора кнопок, которые будут выведены в
нижней части диалогового окна (если задан объект класса Component, он прямо
добавляется в нижнюю часть диалогового окна, если объект типа Icon, создается кнопка
класса JButton, для объектов других классов производится преобразование объекта в
строку, которая выводится на кнопке класса JButton);
 title – имя диалогового окна;
 initialValue – вводимое значение по умолчанию.
Для методов showConfirmDialog() и showOptionDialog() допустимы
следующие возможные значения возвращаемого значения: YES_OPTION, NO_OPTION,
CANCEL_OPTION, OK_OPTION и CLOSED_OPTION.
Пример задания диалогового окна с помощью класса JOptionPane:
JOptionPane questionPane = new JOptionPane(
"Завершить приложение?",
JOptionPane.QUESTION_MESSAGE,
JOptionPane.YES_NO_OPTION);
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 19 Прикладное программирование в ТС
Лекция 3-07
JDialog dialog =
new JDialog(frame, "Окончание работы", true);
dialog.setContentPane(questionPane);
Примеры использования различных видов диалоговых окон приведены на рис. 4.7.
2.4.3.7. Классы JInternalFrame и JDesktopPane
Класс JInternalFrame позволяет создать внутренний фрейм, который имеет те
же свойства, что и обычный фрейм. Конструкторы класса:
JInternalFrame()
JInternalFrame(String title)
JInternalFrame(String title, boolean resizable)
JInternalFrame(String title, boolean resizable,
boolean closable)
JInternalFrame(String title, boolean resizable,
boolean closable, boolean maximizable)
JInternalFrame (String title, boolean resizable,
boolean closable, boolean maximizable, boolean iconifiable)
позволяют задать заголовок внутреннего фрейма title, возможность изменения размера
(параметр resizable), возможность закрытия окна (параметр closable), возможность
максимизации окна (параметр maximizable) и возможность свертки окна (параметр
iconifiable). Все булевские параметры по умолчанию равны true.
а)
б)
в)
г)
д)
е)
ж)
и)
Рис. 4.7. Примеры использования различных видов диалоговых окон:
а) информация; б) вопрос; в) предупреждение; г) ошибка;
д) вопрос с программируемыми ответами; е) информация со своим рисунком;
ж) с выбором из списка; и) с вводом данных
Для обработки событий, связанных с внутренним фреймом, необходимо
реализовать интерфейс InternalFrameListener. Блоки прослушивания для этого
интерфейса добавляются и удаляются с помощью методов
public void addInternalFrameListener(InternalFrameListener l)
и
public void removeInternalFrameListener(InternalFrameListener l)
класса JInternalFrame.
Методы
для
внутренних
фреймов,
объявленные
в
интерфейсе
InternalFrameListener, полностью аналогичны по своим функциям методам
интерфейса WindowListener, а в качестве параметра в них задается объект класса
InternalFrameEvent. Метод этого класса
public JInternalFrame getInternalFrame()
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 20 Прикладное программирование в ТС
Лекция 3-07
позволяет определить внутренний фрейм, вызвавший данное событие.
Обычно создаваемые объекты класса JInternalFrame помещаются в
виртуальный рабочий стол, реализованный в Swing с помощью класса JDesktopPane.
Этот класс расширяет класс JLayeredPane для того, чтобы управлять
перекрывающимися внутренними фреймами.
Для управления внутренними фреймами используются методы, объявления
которых содержатся в интерфейсе DesktopManager. Эти методы позволяют открывать
и закрывать, сворачивать и разворачивать внутренние фреймы, перемещать их, изменять
размеры окон и задавать для них границы. Установка интерфейса выполняется с помощью
метода
public void setDesktopManager(DesktopManager d)
класса JDesktopPane.
Пример реализации внутреннего фрейма приведен на рис. 4.8. При выборе пункта
меню новый создается новый внутренний фрейм).
Рис. 4.8. Пример реализации внутреннего фрейма
2.4.4. Общецелевые контейнеры
2.4.4.1. Класс JPanel
Класс JPanel является вариантом класса Panel в AWT. Четыре конструктора
класса:
public JPanel()
public JPanel(LayoutManager layout)
public JPanel(boolean isDoubleBuffered)
public JPanel(LayoutManager layout,
boolean isDoubleBuffered)
обеспечивают создание объекта JPanel соответственно под управлением менеджера
компоновки FlowLayout, под управлением заданного менеджера компоновки, с
встроенной поддержкой двойной буферизации и, наконец, под управлением заданного
менеджера компоновки и с встроенной поддержкой двойной буферизации.
Работа с объектами класса JPanel не отличается от работы с объектами класса
Panel, за исключением того, что панель добавляются не во фрейм, а в панель
содержимого фрейма, например:
JFrame frame = new JFrame ("JFrame Example");
JPanel myPanel = new JPanel(new FlowLayout());
…
frame.getContentPane().add(myPanel, BorderLayout.CENTER);
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 21 Прикладное программирование в ТС
Лекция 3-07
2.4.4.2. Классы JScrollPane и Viewport
Как и компонент ScrollPane в AWT, компонент JScrollPane обеспечивает
горизонтальную и вертикальную прокрутку содержимого. Он выводит содержимое с
использованием одного из менеджеров компоновки Swing – ScrollPaneLayout.
Конструкторы класса
JScrollPane()
JScrollPane(Component view)
JScrollPane(Component view, int vsbPolicy, int hsbPolicy)
JScrollPane(int vsbPolicy, int hsbPolicy)
позволяют, в отличие от конструкторов ScrollPane, указать выводимый компонент и
отдельно задать политику вывода полос прокрутки по вертикали и горизонтали.
Кроме того, важную роль при выводе объектов с помощью JScrollPane и
других классов просмотра играет класс порта просмотра – JViewport.
Порт просмотра предлагает окно для просмотра некоторого большого по
протяженности объекта, как это показано на рис. 4.9.
View
Viewport
Свойство ViewSize
(высота)
Свойство ExtentSize
(высота)
Свойство ExtentSize
(ширина)
Свойство ViewSize
(ширина)
Рис. 4.9. Порт просмотра в JViewport
Чтобы использовать порт просмотра, в классе JScrollPane имеется метод
public JViewport getViewport().
Затем, чтобы добавить компонент к порту просмотра, можно воспользоваться
одним из методов add() класса Container, например:
JViewport vport = someScrollPane.getViewport();
vport.add(someComponent);
или, более коротко:
someScrollPane.getViewport().add(someComponent);
По умолчанию порт просмотра является прозрачным, но это можно изменить с
помощью метода
public void setOpaque(boolean isOpaque)
класса JComponent. Кроме того, в случае если порт просмотра больше, чем
просматриваемый объект, можно задать цвет фона порта просмотра, например:
someScrollPane.getViewport().setBackground(someColor);
Пример использования прокрутки содержимого (большого изображения) приведен
на рис. 4.10.
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 22 Прикладное программирование в ТС
Лекция 3-07
Рис. 4.10. Пример использования прокрутки содержимого
2.4.4.3. Класс JTabbedPane
Панель с вкладками (tabbed pane) введена в Swing вместо использовавшегося в
AWT менеджера CardLayout, т.е. менеджер компоновки CardLayout в Swing не
реализован. Каждая вкладка имеет заголовок. Когда пользователь выбирает вкладку, ее
содержимое становится видимым. Только одна из вкладок может быть выбрана
одновременно. Панель с вкладками обычно используется для установки параметров
конфигурации или функционирования апплета или графического приложения.
Панель с вкладками реализована классом JTabbedPane, который имеет
следующие конструкторы
JTabbedPane()
JTabbedPane(int tabPlacement)
JTabbedPane(int tabPlacement, int tabLayoutPolicy)
Первый конструктор создает новую панель с вкладками, в которой заголовки
вкладок расположены сверху, а второй позволяет определить расположение заголовков
вкладок (JTabbedPane.TOP – сверху, JTabbedPane.BOTTOM – снизу,
JTabbedPane.RIGHT – вправо или JTabbedPane.LEFT – влево).
Третий конструктор дополнительно задает правило расположения вкладок:
 JTabbedPane.WRAP_TAB_LAYOUT – вкладки располагаются в несколько
рядов, если они не помещаются в одном ряду (значение по умолчанию);
 JTabbedPane.SCROLL_TAB_LAYOUT – вкладки прокручиваются, если они не
помещаются в одном ряду.
Формирование в программе панели с вкладками выполняется с помощью
следующей процедуры:
1. Создать объект JTabbedPane.
2. Для добавления каждой вкладки в панель вызвать один из методов addTab():
public void addTab(String title, Icon icon,
Component component, String tip)
public void addTab(String title, Icon icon,
Component component)
public void addTab(String title, Component component)
Аргументы этих методов определяют заголовок вкладки title, компоненту
component, который она содержит, изображение icon и всплывающую подсказку tip.
3. Добавить панель с вкладками в панель содержания окна.
Для отслеживания выбора той или иной вкладки используется блок прослушивания
ChangeListener, который добавляется или удаляется с помощью методов
public void addChangeListener(ChangeListener l)
и
public void removeChangeListener(ChangeListener l)
класса JTabbedPane. В интерфейсе ChangeListener определен единственный метод
public void stateChanged(ChangeEvent e),
в котором с помощью методов
public Component getSelectedComponent()
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 23 Прикладное программирование в ТС
Лекция 3-07
или
public int getSelectedIndex()
класса JTabbedPane можно получить выбранный компонент или индекс выбранного
компонента.
Пример использования панели с вкладками и обработкой события выбора панели
(вывод имени выбранной панели) приведен на рис. 4.11.
Рис. 4.11. Пример использования панели с вкладками
2.4.4.4. Класс JSplitPane
Расщепленные панели (класс
JSplitPane) используются для разделения
выводимой панели на две компоненты. Конструкторы класса
public JSplitPane()
public JSplitPane(int newOrientation)
public JSplitPane(int newOrientation,
boolean newContinuousLayout)
public JSplitPane(int newOrientation,
Component newLeftComponent, Component newRightComponent)
public JSplitPane(int newOrientation,
boolean newContinuousLayout, Component newLeftComponent,
Component newRightComponent)
задают в параметре newOrientation выравнивание слева направо с использованием
константы JSplitPane.HORIZONTAL_SPLIT или сверху вниз с использованием
константы JSplitPane.VERTICAL_SPLIT, в параметре newContinuousLayout
непрерывную перерисовку компонент при перемещении разделителя (значение true) или
перерисовку компонент после окончания перемещения разделителя (значение false), а в
параметрах newLeftComponent и newRightComponent – компоненты расщепленной
панели.
Положение разделителя в панели можно установить с помощью метода
public void setDividerLocation(int location),
который задает в пикселях позицию x или y разделителя (в зависимости от вертикальной
или горизонтальной ориентации панелей). Метод
public void setOneTouchExpandable(boolean newValue)
позволяет задать на разделительной полосе кнопки (со стрелками) для быстрого
сворачивания и разворачивания одной из панелей расщепленной панели.
Пример использования расщепленной панели для вывода каталога изображений
приведен на рис. 4.12. Окно вывода разделено на два расщепленных окна по горизонтали.
В программе выполняется выбор фигуры и ее цвета, а также задание и установка
координат фигуры.
2.4.4.5. Класс JToolBar
Панель инструментов (класс JToolBar) создается в Swing с помощью одного из
следующих конструкторов:
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 24 Прикладное программирование в ТС
Лекция 3-07
JToolBar()
JToolBar(int orientation)
JToolBar(String name)
JToolBar(String name, int orientation)
где параметр name задает имя, а параметр orientation – ориентацию (горизонтальную
или вертикальную) панели инструментов.
Рис. 4.12. Пример использования расщепленной панели
В панель инструментов обычно помещаются кнопки, текстовые строки и другие
элементы управления.
С помощью метода
public void setToolTipText(String text)
класса JComponent можно задать текст всплывающей подсказки для компонента панели,
а с помощью метода
public void setFloatable(boolean b)
можно установить режим «плавающей» панели, т.е. пользователь может перемещать эту
панель в любое место экрана.
Пример использования панели инструментов приведен на рис. 4.13.
Рис. 4.13. Пример использования панели инструментов
2.4.5. Значки, надписи и кнопки
2.4.5.1. Интерфейс Icon и класс ImageIcon
Значки (icons) реализуются в Swing с помощью интерфейса Icon (на самом деле
они не являются компонентами и их можно использовать практически со всеми
компонентами Swing). Для интерфейса Icon определены следующие методы:
 int getIconHeight()– возвращает высоту значка в пикселях;
 int getIconWidth()– возвращает ширину значка в пикселях;
 void paintIcon(Component comp, Graphics g, int x, int y) –
рисует значок в позиции (x, y) с графическим контекстом g. Дополнительная информация
об операции рисования обеспечена в comp (этот параметр используется редко).
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 25 Прикладное программирование в ТС
Лекция 3-07
Реализацией интерфейса Icon, создающей значок из изображения, является класс
ImageIcon. Двумя основными конструкторами этого класса являются:
ImageIcon(String filename)
ImageIcon(URL url)
Первая форма использует изображение в файле с именем filename (используется
в графических приложениях) а вторая форма – в ресурсе, расположенном по URL-адресу
url (используется в апплетах Swing)
В отличие от класса Image, в классе ImageIcon изображение загружается
предварительно с использованием методов класса MediaTracker.
Для создания собственных изображений можно непосредственно реализовывать
интерфейс Icon.
2.4.5.2. Класс JLabel
Надписи Swing являются объектами
класса JLabel. Этот объект может
отображать тексты и/или значки. Основными его конструкторами являются:
JLabel(Icon image)
JLabel(String text)
JLabel (String text, Icon image, int horizontalAlignment)
В этих конструкторах text и image – текст и значок, используемый в надписи.
Параметр horizontalAlignment определяет выравнивание и имеет значения LEFT,
RIGHT или CENTER. Эти константы определены в интерфейсе SwingConstants, наряду
с несколькими другими, используемыми классами системы Swing.
Значок и текст, связанный с надписью, можно считывать и записывать
следующими методами:
public Icon getIcon();
public String getText();
public void setIcon(Icon image);
public void setText(String text);
Пример задания текстовой надписи и надписи с изображением приведен на рис.
4.14.
Рис. 4.14. Пример задания текстовой надписи и надписи с изображением
2.4.5.3. Класс AbstractButton
Кнопки Swing являются подклассами класса AbstractButton. Этот класс
содержит много методов, которые позволяют управлять поведением кнопок, флажков и
переключателей. Например, можно определять различные значки для отображения
компонента, когда он отжат (disabled), нажат (pressed), или выбран (selected). Некоторый
значок можно использовать как значок "наезда" (rollover), который отображается, когда
курсор мыши установлен поверх этого компонента ("наехал" на него). Ниже приведены
описания методов, которые управляют этим поведением:
public void setDisabledIcon(Icon image)
public void setPressedIcon (Icon image)
public void setSelectedIcon(Icon image)
public void setRolloverIcon(Icon image)
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 26 Прикладное программирование в ТС
Лекция 3-07
Текст, связанный с кнопкой, можно читать и записывать с помощью следующих
методов:
public String getText()
public void setText(String text)
В классе AbstractButton определены также методы
public int getMnemonic()
и
public void setMnemonic(int mnemonic)
соответственно для получения и установки «горячих» клавиш. В качестве параметра при
установке «горячей» клавиши задается оно из статических свойств класса KeyEvent. Эти
свойства имеют общее имя VK_XXX, где XXX – имя одной из клавиш, например, VK_D.
Предложение
myButton.setMnemonic(KeyEvent.VK_D);
означает, что нажатие клавиш Alt+D эквивалентно нажатию кнопки myButton.
При нажатии кнопки конкретные подклассы AbstractButton генерируют
события Action. Блоки прослушивания регистрируют и отменяют регистрацию для этих
событий с помощью следующих методов:
void addActionListener(ActionListener l)
void removeActionListener(ActionListener l)
Рассмотрим подклассы класса AbstractButton.
2.4.5.4. Класс JButton
Класс JButton обеспечивает функциональные возможности кнопки. Этот класс
позволяет связать с кнопкой изображение, текст или и то и другое. Некоторые из его
конструкторов:
JButton(Icon image)
JButton(String text)
JButton(String text, Icon image)
Здесь text и image – надпись и изображение, используемые для кнопки.
Класс JButton наследует свойства интерфейса SwingConstants, а также
свойства и методы класса AbstractButton.
Пример использования кнопок с изображением и обработки события нажатия
кнопки (вывод сообщения) приведен на рис. 4.15.
Рис. 4.15. Пример использования кнопок с изображением
2.4.6. Флажки и переключатели
Класс JCheckBox, который обеспечивает функциональные возможности флажка,
является конкретной реализацией класса AbstractButton. некоторые из его
конструкторов:
JCheckBox(Icon image)
JCheckBox(Icon image, boolean state)
JCheckBox(String text)
JCheckBox(String text, boolean state)
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 27 Прикладное программирование в ТС
Лекция 3-07
JCheckBox (String text, Icon image)
JCheckBox(String text, Icon image, boolean state)
В этих конструкторах используются следующие параметры: image —
изображение для флажка, text – надпись. Если state имеет значение true, то флажок
первоначально выбран.
Состояние флажка может быть изменено с помощью метода
void public void setSelected(boolean b),
а получить состояние флажка можно с помощью метода
public boolean isSelected().
Переключатели поддерживаются классом JRadioButton, который
также
является конкретной реализацией класса AbstractButton. Ниже приведены некоторые
из его конструкторов:
JRadioButton(Icon image)
JRadioButton(Icon image, boolean state)
JRadioButton(String text)
JRadioButton(String text, boolean state)
JRadioButton(String text, Icon image)
JRadioButton(String text, Icon image, boolean state)
где параметры имеют тот же смысл, что и для класса JCheckBox.
Переключатели должны быть объединены в группу, где в каждый момент может
быть выбран только один элемент. Например, если пользователь щелкает по
переключателю, который находится в группе, любой предварительно нажатый
переключатель в этой группе автоматически сбрасывается. Чтобы создать группу кнопок,
создается объект класса ButtonGroup. Для этой цели используется единственный
конструктор класса
public ButtonGroup().
Элементы к группе переключателей добавляются с помощью метода
public void add(AbstractButton a),
а количество переключателей в группе можно получить с помощью метода
public int getButtonCount().
Родительским классом и для JCheckBox и для JRadioButton является класс
JToggleButton, который не имеет эквивалента в AWT. Он ведет себя как объект класса
Button, который после нажатия на него остается в нажатом состоянии.
Пример использования флажков и переключателей с их пользовательским
оформлением и обработкой событий выбора (вывод сообщений) приведен на рис. 4.16.
Рис. 4.16. Пример использования флажков и переключателей
Файл: 681450988 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
Download