Лекция 3-08

advertisement
-1Прикладное программирование в ТС
Лекция 3-08
Лекция 3-08
2.4.7. Списки
2.4.7.1. Класс JComboBox
2.4.7.2. Класс JList
2.4.7.3. Класс JSpinner
2.4.8. Текстовые компоненты
2.4.8.1. Класс JTextComponent
2.4.8.2. Классы JTextField, JPasswordField и JTextArea
2.4.8.3. Класс JEditorPane
2.4.9. Меню
2.4.10. Индикаторы, бегунки и подсказки
2.4.10.1. Класс JProgressBar
2.4.10.2. Классы JScrollBar и JSlider
2.4.10.3. Класс JToolTip
2.4.11. Деревья
2.4.12. Таблицы
2.4.13. Выбор цветов
2.4.14. Менеджеры компоновки Swing
2.4.14.1. Менеджер компоновки ScrollPaneLayout
2.4.14.2. Менеджер компоновки ViewportLayout
2.4.14.3. Менеджер компоновки OverlayLayout
2.4.14.4. Менеджер компоновки BoxLayout
2.4.14.5. Менеджер компоновки SpringLayout
2.4.15. Оформление рамок
2.4.16. Обработка событий в Swing
2.4.17. Изменение внешнего вида компонента
2.4.7. Списки
2.4.7.1. Класс JComboBox
Вместо класса Choice в AWT, в системе Swing обеспечивает комбинированное
поле (combo box) – комбинация текстового поля и раскрывающегося списка (класс
JComboBox). Комбинированное поле обычно отображает один вход (элемент) списка.
Однако оно может также отображать и раскрывающийся список, который дает
возможность пользователю выбирать различные элементы. Вы также можете ввести с
клавиатуры свое значение элемента списка в текстовое поле. Два самых
распространенных конструктора:
JComboBox()
JComboBox(Object [] items)
позволяют создать пустой список с выбором или задать массив объектов данного списка.
Элементы добавляются к списку выбора с помощью метода
void addItem(Object obj)
где obj – объект, который будет добавлен к комбинированному полю.
Остальные методы класс аналогичны соответствующим методам класса Choice,
однако добавлены методы
public void setEditable(boolean aFlag)
и
public boolean isEditable(),
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-2Прикладное программирование в ТС
Лекция 3-08
позволяющие установить возможность ввода значения в список и проверить флажок
возможности ввода своего значения в список.
Для обработки событий, связанных с комбинированным списком, можно
использовать либо блоки прослушивания ItemListener, либо блоки прослушивания
ActionListener, описанные ранее для компонент AWT.
Пример использования комбинированного поля с обработкой событий выбора
(вывод выбранной дисциплины) приведен на рис. 4.17.
Рис. 4.17. Пример использования комбинированного поля
2.4.7.2. Класс JList
Аналогом класса List в Swing является класс JList. Два самых
распространенных конструктора этого класса
JList()
JList(Object [] items)
позволяют задать либо пустой список, либо список, содержащий заданные объекты
(обратите внимания, что элементами списков в Swing могут быть не только строки, но
произвольные объекты).
Прокрутка списка не выполняется в JList автоматически, а выполняется с
помощью помещения списка в объект класса JScrollPane.
Набор методов в классе JList существенно расширен по сравнению с классом
List (так, например, есть возможность задавать цвет текста и фона для выделенных
элементов) и, кроме того, вместо интерфейса ItemListener для списков JList
используется интерфейс ListSelectionListener, блок прослушивания которого
добавляется и удаляется с помощью методов
public void addListSelectionListener(ListSelectionListener
listener)
и
public void removeListSelectionListener(
ListSelectionListener listener)
класса JList.
Метод
public void valueChanged(ListSelectionEvent e)
интерфейса обрабатывает события, связанные с выбором элементов списка, а метод
public Object[] getSelectedValues()
класса JList позволяет получить список выбранных объектов.
Пример использования списка с обработкой событий выбора (вывод выбранных
дисциплин) приведен на рис. 4.18.
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-3Прикладное программирование в ТС
Лекция 3-08
Рис. 4.18. Пример использования списка
2.4.7.3. Класс JSpinner
Класс JSpinner определяет «вращающийся» список. Этот класс похож на класс
JComboBox, но однострочный список можно прокручивать в двух направлениях: вверх и
вниз с помощью двух кнопок справа от поля выбора.
Для класса JSpinner определены два конструктора:
JSpinner()
и
JSpinner(SpinnerModel model).
Второй конструктор создает объект для заданной модели «вращающего» списка. В
пакете определены класса для наиболее употребительных моделей «вращающего»
списка: SpinnerListModel (для списков), SpinnerNumberModel (для чисел) и
SpinnerDateModel (для дат).
Установить или получить модель можно либо с помощью методов
void setModel(SpinnerModel model)
и
SpinnerModel getModel().
Изменить выводимое в поле значение можно с помощью метода
void setValue(Object value),
а получить текущее значение поля можно с помощью метода
Object getValue()
класса JSpinner.
Установить конкретную модель для списков можно с помощью следующих
конструкторов:
SpinnerListModel();
SpinnerListModel(List values);
SpinnerListModel(Object[] values);
Первый конструктор создает модель для пустого списка, второй для списка
объектов коллекции List, а третий для массива объектов класса Object.
Метод
void setValue(Object obj)
изменяет элемент в поле вывода и уведомляет блок прослушивания ChangeListener.
Методы
Object getValue().
Object getNextValue()
Object getPreviousValue()
позволяют получить соответственно текущее значение поля вывода, следующее значение
поля вывода и предыдущее значение поля вывода. Если текущий элемент – последний,
метод getNextValue() возвращает null, а если текущий элемент – первый, метод
getPreviousValue() возвращает null.
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-4Прикладное программирование в ТС
Лекция 3-08
Пример реализации модели списка:
String[] ordinalNumbers =
{"Первый", "Второй", "Третий", "Четвертый"};
SpinnerListModel listModel =
new SpinnerListModel(ordinalNumbers);
JSpinner listSpinner = new JSpinner(listModel);
String selectedNumber = listModel.getValue().toString();
Основными конструкторами модели чисел являются:
SpinnerNumberModel();
SpinnerNumberModel(int value, int minimum,
int maximum, int stepSize)
где value – выводимое в поле вывода значение, minimum – минимальное значение
списка, maximum – максимальное значение списка, stepSize – шаг списка. Пустой
конструктор устанавливает список с нулевым значением в поле вывода, без ограничений
на максимальное и минимальное значение и с шагом, равным 1.
Значения указанных параметров также можно установить с помощью методов
void setValue(Object value)
void setMinimum(Comparable minimum)
void setMaximum(Comparable maximum)
void setStepSize(Number stepSize)
а получить их значения – с помощью методов
Object getValue()
Object getNextValue()
Object getPreviousValue()
Comparable getMinimum()
Comparable getMaximum()
Number getStepSize()
Пример реализации модели чисел:
SpinnerNumberModel numberModel =
new SpinnerNumberModel(50, 1, 100,1);
JSpinner numberSpinner = new JSpinner(numberModel);
String selectedNumber = listModel.getValue().toString();
Integer selectedNumber = (Integer) numberModel.getValue();
int nCurrent = selectedNumber.intValue();
Для работы с датами определены следующие конструкторы:
SpinnerDateModel();
SpinnerDateModel(Date value, Comparable start,
Comparable end, int calendarField)
где value – выводимое значение даты, start и end – начальное и конечное значение
даты, а допустимые значения для calendarField:
 Calendar.ERA – эра (значение GregorianCalendar.BC – до нашей эры
или GregorianCalendar.AD – наша эра);
 Calendar.YEAR и Calendar.MONTH – значение года и месяца (от 0 до 11);
 Calendar.WEEK_OF_YEAR и Calendar.WEEK_OF_MONTH – неделя года и
неделя месяца;
 Calendar.DAY_OF_MONTH и Calendar.DAY_OF_YEAR – день месяца и день
года;
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-5Прикладное программирование в ТС
Лекция 3-08
 Calendar.DAY_OF_WEEK и Calendar.DAY_OF_WEEK_IN_MONTH – день
недели (от 1 до 7) и день недели в месяце (1-7 дни месяца – 1 неделя, 8-14 – 2 неделя и
т.д.);
 Calendar.AM_PM – до полудня – значение Calendar.AM или после полудня
– значение Calendar.PM;
 Calendar.HOUR и Calendar.HOUR_OF_DAY, - час в формате от 0 до 12 или
от 0 до 24;
 Calendar.MINUTE, Calendar.SECOND и Calendar.MILLISECOND –
минута, секунда и миллисекунда.
Значения указанных параметров также можно установить с помощью методов
void setValue(Object value)
void setStart(Comparable start)
void setEnd(Comparable end)
void setCalendarField(int calendarField)
а получить их значения – с помощью методов
Object getValue()
Object getNextValue()
Object getPreviousValue()
Comparable getStart()
Comparable getEnd()
Number getCalendarField ()
Метод
Date getDate()
возвращает текущий элемент в последовательности дат в виде объекта класса Date.
Пример реализации модели дат:
SpinnerDateModel model = new SpinnerDateModel();
JSpinner spinner = new JSpinner(model);
Date value = model.getDate();
Пример использования «вращающегося» списка для определения возраста по
введенной дате рождения приведен на рис. 4.19.
Рис. 4.19. Пример использования «вращающегося» списка
2.4.8. Текстовые компоненты
2.4.8.1. Класс JTextComponent
Родительским классом текстовых компонент в Swing является класс
JTextComponent. Он обеспечивает функциональные возможности, которые являются
общими для всех текстовых компонент.
Возможности компонента JTextComponent библиотеки Swing намного
превосходят требования, предъявляемые к обычному текстовому полю или надписи.
Данный компонент предоставляет разработчикам большой набор методов работы с
текстом, например:
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-6Прикладное программирование в ТС
Лекция 3-08
 public void copy() – копировать в буфер обмена;
 public void cut() – вырезать в буфер обмена;
 public void paste() – вставить из буфера обмена;
 public String getSelectedText() – получить выделенный текст;
 public int getSelectionStart() – определить точку начала
выделенного текста;
 public int getSelectionEnd() – определить точку конца выделенного
текста;
 public String getText() – ввести текст из поля;
 public void setText(String text) – поместить текст в поле;
 public void setEditable(boolean b) – разрешить редактирование;
 public void setCaretPosition(int position) – поместить курсор в
указанную позицию.
Пример использования объекта класса JTextComponent для создания текстового
редактора с возможностью задания размера, стиля и цвета текста, а также возможностью
копирования, вырезания и вставки текста приведен на рис. 4.20.
Рис. 4.20. Пример использования объекта класса JTextComponent
для создания текстового редактора
2.4.8.2. Классы JTextField, JPasswordField и JTextArea
Подклассы класса JTextComponent – JTextField и JTextArea практически
аналогичны классам TextField и TextArea пакета AWT. Между ними существуют
лишь следующие отличия:
 строки ввода паролей задаются в Swing с помощью отдельного класса
JPasswordField (конструкторы этого класса аналогичны конструкторам класса
JTextField, метод public char[] getPassword() позволяет получить значение
введенного пароля, а методы public void setEchoChar(char c) и public char
getEchoChar() – установить и получить значение эхо-символа);
 прокрутка объекта класса JTextArea (так же, как и объекта класса JList)
выполняется с помощью помещения списка в объект класса JScrollPane.
Пример использования текстовых полей, поля пароля и текстовой области с
обработкой события ввода пароля (вывод значения пароля) приведен на рис. 4.21.
Новыми по сравнению с AWT являются в Swing классы JEditorPane и
JTextPane.
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-7Прикладное программирование в ТС
Лекция 3-08
Рис. 4.21. Пример использования текстовых полей, поля пароля и текстовой области
2.4.8.3. Класс JEditorPane
Класс JEditorPane позволяет создавать редакторы для различных типов
редактируемых объектов. Редактирование различных типов содержимого выполняется с
помощью свойств и методов класса EditorKit из пакета javax.swing.text.
По умолчанию известны следующие типы содержания:
 простой текст (MIME-тип text/plain) – используются свойства и методы
подкласса DefaultEditorKit класса EditorKit;
 текст, содержащий дескрипторы HTML (MIME-тип text/html) – используются
свойства и методы подкласса HTMLEditorKit класса EditorKit;
 текст в формате rtf (MIME-тип text/rtf) – используются свойства и методы
подкласса RTFEditorKit класса EditorKit.
В классе JTextPane фактически реализован полнофункциональный текстовый
редактор, позволяющий форматировать вводимый текст и внедрять в него графические
изображения. Обеспечивается также перенос текста с учет используемого шрифта, его
размера и стиля.
Подробное рассмотрение возможностей, свойств и методов классов
JTextComponent, JEditorPane и JTextPane не приводится, ввиду их сложности,
однако следует иметь в виду, что эти классы существенно облегчают разработку
собственных редакторов для различных текстовых форматов.
Пример использования объекта класса JTextPane для создания простого
текстового редактора с возможностью вставки и удаления текста приведен на рис. 4.22.
Рис. 4.22. Пример использования объекта класса JTextPane
для создания простого текстового редактора
2.4.9. Меню
Компоненты JMenuBar, JMenu, JMenuItem и JCheckBoxMenuItem в Swing по
своим функциональным возможностям и использованию аналогичны компонентам
MenuBar, Menu, MenuItem и CheckboxMenuItem, используемым в AWT.
Новый компонент JRadioButtonMenuItem позволяет организовать в меню
переключатели. Группа альтернативных переключателей формируется следующим
образом: сначала создается объект класса ButtonGroup, а затем в этот объект с
помощью метода add() добавляются объекты класса JRadioButtonMenuItem.
Классы, реализующие меню в Swing, отличаются от соответствующих классов
AWT следующими основными особенностями:
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-8Прикладное программирование в ТС
Лекция 3-08
 поскольку все классы, кроме JMenuBar, являются подклассами класса
JAbsractButton, для меню и пунктов меню можно задавать не только текст, но и
изображения (для этого в конструкторы этих классов введен параметр Icon image и
добавлены методы, связанные с изображениями);
 строка меню устанавливается с помощью метода
public void
setJMenuBar(JMenuBar menubar) класса JFrame;
 добавлен интерфейс MenuListener для обработки событий связанных с меню
(объектами класса JMenu). Методы этого интерфейса
public void menuSelected(MenuEvent e)
public void menuDeselected(MenuEvent e)
public void menuCanceled(MenuEvent e)
позволяют обрабатывать события, связанные с выбором меню, отменой выбора меню и
отменой меню. Блоки прослушивания для меню добавляются и удаляются с помощью
методов
public void addMenuListener(MenuListener l)
и
public void removeMenuListener(MenuListener l);
 мнемонические клавиши («горячие» клавиши) для меню и пунктов меню в
отличие от AWT действуют только тогда, когда соответствующие меню или пункты меню
выведены на экране. Для того, чтобы клавиши действовали независимо от того, виден ли
соответствующий элемент меню на экране, необходимо задать такие клавиши с помощью
метода public void setAccelerator(KeyStroke keyStroke) например:
myMenuItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_N, ActionEvent.ALT_MASK));
 для пунктов меню введен интерфейс MenuDragMouseListener, методы
которого
public void menuDragMouseEntered(MenuDragMouseEvent e)
public void menuDragMouseExited(MenuDragMouseEvent e)
public void menuDragMouseDragged(MenuDragMouseEvent e)
public void menuDragMouseReleased(MenuDragMouseEvent e)
позволяют организовать обработку событий, связанных с перемещением курсора мыши
над пунктами меню (например, изменения вида пункта меню при наведении на него
курсора мыши). Блоки прослушивания для меню добавляются и удаляются с помощью
методов
public void addMenuDragMouseListener(
MenuDragMouseListener l)
и
public void removeMenuDragMouseListener(
MenuDragMouseListener l);
 кроме этого, для пунктов меню введен интерфейс MenuKeyListener, методы
которого
public void menuKeyTyped(MenuKeyEvent e)
public void menuKeyPressed(MenuKeyEvent e)
public void menuKeyReleased(MenuKeyEvent e)
позволяет организовать обработку событий, связанных с нажатием и отпусканием, а также
отдельно с нажатием и отдельно с отпусканием клавиш, связанных с пунктами меню.
Класс JPopupMenu в Swing функционирует аналогично классу PopupMenu в
AWT. Он вызывается при нажатии правой клавиши мыши в том месте окна, где находится
курсор мыши. Пункты меню вставляются во всплывающее меню также, как и в обычное
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
-9Прикладное программирование в ТС
Лекция 3-08
меню, однако для обработки событий, связанных с всплывающим меню в Swing введен
интерфейс PopupMenuListener. Методы этого интерфейса
public void popupMenuWillBecomeVisible(PopupMenuEvent e)
public void popupMenuWillBecomeInvisible(PopupMenuEvent e)
public void popupMenuCanceled(PopupMenuEvent e)
позволяют организовать обработку событий, когда всплывающее меню становится
соответственно видимым или невидимым, а также при отмене всплывающего меню.
Методы
public void addPopupMenuListener(PopupMenuListener l)
и
public void removePopupMenuListener(PopupMenuListener l)
класса JPopupMenu позволяют добавить или отменить блоки прослушивания для
обработки событий, связанных со всплывающим меню.
Пример использования меню с обработкой событий выбора пункта меню (вывод
наименований меню и команды, для команд типа CheckBox – изменения состояния, а для
команд типа JRadioButtonMenuItem – выбор переключателя) приведен на рис. 4.23.
Рис. 4.23. Пример использования меню в Swing
2.4.10. Индикаторы, бегунки и подсказки
2.4.10.1. Класс JProgressBar
Объект класса JProgressBar используется в тех случаях, когда требуется
отслеживать выполнение какой-либо операции (например, копирование файлов каталога),
которая выполняется как отдельный поток в фоновом режиме. Объект выводится на
экран как индикатор степени выполнения операции (обычно в процентах).
Основные конструкторы класса JProgressBar:
JProgressBar()
JProgressBar(int orient)
JProgressBar(int min, int max)
JProgressBar(int orient, int min, int max)
позволяют задать пустой индикатор, индикатор с заданной ориентацией orient
(горизонтальной или вертикальной), индикатор с заданным минимальным min и
максимальным max значением, а также индикатор с заданной ориентацией orient, а
также значениями min и max.
Для отслеживания событий, связанных с индикатором, необходимо реализовать
интерфейс ChangeListener и его метод
public void stateChanged(ChangeEvent e).
Блок прослушивания для событий, связанных с индикатором, добавляется и
удаляется с помощью методов
public void addChangeListener(ChangeListener l)
и
public void removeChangeListener(ChangeListener l).
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 10 Прикладное программирование в ТС
Лекция 3-08
Пример использования индикатора, показывающего процент
некоторой задачи, состоящей из 1000 этапов, приведен на рис. 4.24.
выполнения
Рис. 4.24. Пример использования индикатора степени выполнения
2.4.10.2. Классы JScrollBar и JSlider
Полоса прокрутки (класс JScrollBar) в Swing практически не отличается от
полосы прокрутки (класс Scrollbar) в AWT.
Бегунки реализуются в Swing с помощью класса JSlider. Этот компонент, как и
JScrollBar, позволяет выбрать значение с помощью перемещения бегунка. Основными
конструкторами класса JSlider являются
JSlider()
JSlider(int orientation)
JSlider(int min, int max)
JSlider(int min, int max, int value)
JSlider(int orientation, int min, int max, int value)
где параметр orientation задает ориентацию, а параметры min, max и value
соответственно минимальное, максимальное и текущее значение бегунка.
Для бегунков можно задать линейки с рисками большой или маленькой высоты с
использованием методов
public void setMajorTickSpacing(int n)
и
public void setMinorTickSpacing(int n),
где параметр n задает расстояние между рисками в пикселях.
Для отслеживания событий бегунка используется интерфейс ChangeListener,
описанный выше для индикатора.
Примеры задания бегунков приведены на рис. 4.25.
Рис. 4.25. Примеры задания бегунков
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 11 Прикладное программирование в ТС
Лекция 3-08
2.4.10.3. Класс JToolTip
«Всплывающие» подсказки (текст, появляющийся, если навести на некоторое
время указатель мыши на какой-либо объект) реализуются в Swing с помощью класса
JToolTip. Объект этого класса создается с помощью конструктора
JToolTip().
Прикрепить подсказки к компоненту и получить компонент, к которому
прикреплена данная подсказка, можно с помощью методов
void setComponent(JComponent comp)
и
JComponent getComponent(),
а установка и получение текста подсказки выполняется с помощью методов
void setTipText(String tipText)
и
String getTipText().
Методы класса JComponent
public void setToolTipText(String text)
и
public String getToolTipText()
позволяют установить и получить подсказку непосредственно для любого графического
компонента, например:
JButton button1 = New JButton("Кнопка 1");
button1. setToolTipText("Первая кнопка");
Пример подсказки для инструмента панели инструментов приведен на рис. 4.13.
2.4.11. Деревья
Дерево (tree) – компонент, который представляет иерархический вид данных.
Пользователь имеет возможность развернуть или свернуть индивидуальные поддеревья в
дереве. Деревья реализованы в Swing классом JTree, с помощью одного из следующих
основных конструкторов:
JTree(Hashtable ht)
JTree(Object obj[])
JTree(TreeNode tn)
JTree(Vector v)
Первая форма создает дерево, в котором дочерней вершиной является каждый
элемент хэш-таблицы ht. Во второй форме дочерней вершиной является каждый элемент
массива obj. В третьей форме параметр tn указывает корневой узел дерева. Наконец,
последняя форма использует элементы векторного параметра v как дочерние вершины.
Когда узел разворачивается или сворачивается, объект JTree генерирует события.
Методы
public void addTreeExpansionListener(
TreeExpansionListener l)
и
public void removeTreeExpansionListener(
TreeExpansionListener l)
позволяют блокам прослушивания регистрировать или отменять регистрацию этих
событий.
Чтобы преобразовать щелчок мыши на определенной точке дерева в ветвь (путь)
дерева используется метод
public TreePath getPathForLocation(int x, int у),
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 12 Прикладное программирование в ТС
Лекция 3-08
где х и у – координаты указателя мыши, где выполнен щелчок. Возвращаемое значение –
объект класса TreePath, который содержит информацию относительно узла дерева,
выбранного пользователем.
Методы класса TreePath обеспечивают информацию о пути к заданному узлу
дерева.
Интерфейс TreeNode объявляет методы, которые получают информацию
относительно узла дерева. Например, возможно получить ссылку к родительскому узлу
или перечислению дочерних узлов. Интерфейс MutableTreeNode расширяет
TreeNode. Он объявляет методы, которые могут вставлять и удалять дочерние узлы или
изменять родительский узел.
Класс DefaultMutableTreeNode реализует интерфейс MutableTreeNode.
Он представляет узел в дереве. Ниже приведен один из его конструкторов:
DefaultMutableTreeNode(Object obj)
Здесь obj – это объект, который будет включен в этот узел дерева. Новый узел
дерева не имеет родительского или дочернего узла.
Чтобы создавать иерархию узлов дерева, можно использовать метод
public void add(MutableTreeNode child)
класса DefaultMutableTreeNode. Здесь child является изменяемым узлом дерева,
который должен быть добавлен как дочерний к текущему узлу.
События расширения дерева описаны классом TreeExpansionEvent. Метод
public TreePath getPath()
этого класса возвращает объект TreePath, который описывает путь к измененному узлу.
Интерфейс TreeExpansionListener обеспечивает следующие два метода:
public void treeCollapsed(TreeExpansionEvent e)
public void treeExpanded(TreeExpansionEvent event)
Первый метод вызывается, когда поддерево сворачивается, а второй когда
поддерево становится видимым (разворачивается).
Создание дерева в программе выполняется по следующему алгоритму:
1. Создать объект JTree.
2. Создать объект JScrollPane. (Аргументы конструктора определяют дерево и
установку вертикальных и горизонтальных полос прокрутки.)
3. Добавить дерево к панели прокрутки.
4. Добавить панель прокрутки к панели содержания.
Пример использования дерева каталога книг по языку Java (в верхнем расщепленном окне)
приведен на рис. 4.26.
Рис. 4.26. Пример использования дерева для представления иерархической структуры
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 13 Прикладное программирование в ТС
Лекция 3-08
2.4.12. Таблицы
Таблица (table) — компонент, который отображает строки и столбцы данных. Для
изменения размеров столбцов можно перемещать курсором их границы. Можно также
перетаскивать столбцы в новую позицию. Таблицы реализованы в Swing с помощью
класса JTable (пакет javax.swing), основными конструкторами которого являются:
JTable()
JTable(int numRows, int numColumns)
JTable(Object[][] rowData, Object[] columnNames)
Первый конструктор задает пустую таблицу. Второй конструктор задает шаблон
таблицы с количеством строк numRows и количеством столбцов numColumns, а в
третьем конструкторе задается таблица с данными rowData и именами столбцов
columnNames.
Эти конструкторы позволяют сформировать простые таблицы, в которых все
ячейки таблицы являются редактируемыми.
Пример задания простой таблицы:
// Формирование заголовка таблицы
String[] studentColumnNames = {"Ф.И.О. студента",
"Группа",
"Год рождения",
};
// Формирование данных таблицы
Object[][]studentData = {
{"Иванов И.И.", "АТР-22", new Integer(1988)},
{"Петров П.П.", "АТР-21", new Integer(1987)},
{"Сидоров С.С.", "АТР-23", new Integer(1989)},
};
// Создание таблицы
JTable studentTable =
new JTable(studentData, studentColumnNames);
…
// Объявление и создание объекта класса JFrame
JFrame frame = new JFrame ("Вывод таблицы");
// Вывод заголовка таблицы
frame.add(studentTable.getTableHeader(),
BorderLayout.PAGE_START);
// Вывод содержимого таблицы
frame.getContentPane().add(studentTable,
BorderLayout.CENTER);
Вывод этой таблицы приведен на рис. 4.27.
Рис. 4.27. Вывод простой таблицы
Методы класса позволяют добавлять, перемещать и удалять столбцы таблицы,
задавать и получать значения ячеек таблицы, а также выполнять другие операции над
таблицами и их элементами.
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 14 Прикладное программирование в ТС
Лекция 3-08
Класс JTable реализует компонент «Вид» схемы MVC. В более сложных случаях,
когда необходимо задавать способ вывода, запрещать редактирование отдельных ячеек
таблицы, динамически формировать таблицу, например, при обращении к базе данных
или выводить выборку из таблицы, необходимо использовать компонент «Модель»,
реализованный следующими интерфейсами в пакете javax.swing.table:
 TableModel – определяет методы, с помощью которых компонент «Вид»
запрашивает данные из модели;
 TableColumnModel – определяет требования к столбцам таблицы при их
использовании компонентом «Вид»;
 TableCellRenderer определяет метод выполняющий графический вывод
содержимого ячейки – getTableCellRendererComponent();
 TableCellEditor – определяет
метод,
задающий
возможность
редактирования ячеек таблицы – getTableCellEditorComponent().
Интерфейс TableModel реализован в пакете javax.swing.table классом
AbstractTableModel, в котором описаны основные методы интерфейса и классом
DefaultTableModel, в котором строки таблицы описаны как объекты класса Vector,
а каждая строка также содержит объект класса Vector – содержимое ячеек строки.
Класс DefaultTableColumnModel стандартным образом реализует методы
интерфейса TableColumnModel.
Если требуется использовать свою модель таблицы, необходимо либо создать
класс-наследник классов
AbstractTableModel, DefaultTableModel или
DefaultTableColumnModel, либо непосредственно реализовать в создаваемых
классах интерфейсы TableModel и TableColumnModel.
В тех случаях, когда значение ячейки таблицы представляет объект класса
JLabel,
для
вывода
содержимого
ячейки
можно
использовать
класс
DefaultTableCellRenderer, реализующий интерфейс TableCellRenderer. Если
содержимое ячейки является объектом другого класса, например, переключателем (класс
JCheckBox) или списком (класс JList), необходимо создать класс-наследник
DefaultTableCellRenderer и переопределить в нем метод setValue() для вывода
объектов заданного класса.
Интерфейс TableCellEditor должен реализовываться теми классами,
описывающими модель данных таблицы, в которых необходимо управление
редактированием значений в ячейках таблицы.
Помимо приведенных интерфейсов и классов, в пакете javax.swing.table
реализованы следующие основные классы:
 JTableHeader – методы этого класса управляют выводом заголовка таблицы;
 TableColumn – методы этого класса позволяют получать и изменять
характеристики столбцов таблицы (например, высоту и ширину).
Для обработки событий, связанных с таблицей, в Swing определены два
интерфейса: TableModelListener и TableColumnModelListener. Интерфейсы и
классы событий описаны в пакете javax.swing.event.
Интерфейс TableModelListener используется для прослушивания событий,
связанных с изменениями модели таблицы. При этих изменения создается объект класса
TableModelEvent, в котором реализованы методы
int getColumn()
int getFirstRow()
int getLastRow()
int getType()
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 15 Прикладное программирование в ТС
Лекция 3-08
Первый метод возвращает индекс столбца таблицы, в котором произошло событие,
второй и третий – индекс первой и последней строки таблицы, для которой произошло
событие. Последний метод возвращает тип события: вставка (константа
TableModelEvent.INSERT), изменение (константа TableModelEvent.UPDATE)
или удаление (константа TableModelEvent.DELETE).
Интерфейс TableColumnModelListener используется для прослушивания
событий, связанных с добавлением, перемещением или удалением столбца таблицы. При
этих изменения создается объект класса TableColumnModelEvent, методы которого –
int getFromIndex() и int getToIndex() позволяют соответственно получить
индекс перемещаемого или удаляемого столбца и индекс, в который будет перемещен или
добавлен столбец.
Если данные в ячейках таблицы являются объектами классов, отличных от
JLabel, (например, JCheckBox или JList) для обработки связанных с этими
объектами событий должны быть заданы соответствующие блоки прослушивания.
Пример вывода таблицы сотрудников учреждения, полученной в результате
запроса к базе данных, приведен на рис. 4.28. В таблице можно изменять значения в
ячейках, удалять строки или добавлять новые строки.
Рис. 4.28. Пример вывода таблицы сотрудников учреждения
2.4.13. Выбор цветов
Для выбора цветов и манипулирования цветами в Swing можно использовать класс
JColorChooser. Конструкторы этого класса
JColorChooser()
JColorChooser(Color initialColor)
JColorChooser(ColorSelectionModel model)
позволяют создать панель выбора цвета, в том числе и с заданным начальным цветом
initialColor или моделью выбора цвета model.
Методы
класса
JColorChooser
используют
классы
AbstractColorChooserPanel,
ColorChooserComponentFactory
и
DefaultColorSelectionModel, а также интерфейс ColorSelectionModel пакета
javax.swing.colorchooser.
Основными методами класса являются методы
public ColorSelectionModel getSelectionModel()
и
public void setSelectionModel(ColorSelectionModel newModel),
позволяющие получать и устанавливать модели выбора цвета. Для обработки событий,
связанных с выбором цвета используется описанный ранее интерфейс ChangeListener.
Пример использования объекта класса JColorChooser в диалоговом окне (в
области «Выбор цвета») для выбора цвета объекта приведен на рис. 4.29.
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 16 Прикладное программирование в ТС
Лекция 3-08
2.4.14. Менеджеры компоновки Swing
Помимо компоновок библиотеки AWT, в библиотеку Swing включено пять новых
типа компоновки.
 ScrollPaneLayout – является встроенным для компонента ScrollPane;
 ViewportLayout – является встроенным в компонент Viewport;
 BoxLayout – является встроенным в компонент Box, однако как один из
вариантов он доступен в других типах компонентов;
 OverlayLayout – тип компоновки, в котором каждый добавляемый компонент
помещается поверх всех предыдущих;
 SpringLayout – размещает элементы в соответствии с заданными
ограничениями;
 GroupLayout – иерархически размещает группы элементов в соответствии с
заданными параметрами.
Рис. 4.29. Пример использования объекта класса JColorChooser
2.4.14.1. Менеджер компоновки ScrollPaneLayout
Используя библиотеку Swing, нет необходимости явно определять тип компоновки
с помощью класса ScrollPaneLayout – достаточно просто создать новый экземпляр
объекта класса JScrollPane. В результате автоматически появляется возможность
использовать девять различных областей, предусмотренных этим типом компоновки:
 JViewport – единственная область этого типа расположена в центре окна и
может быть использована для отображения его основного содержания.
 JScrollBar – две области этого типа предназначены для размещения
горизонтальной и вертикальной полос прокрутки.
 JViewport – две области этого типа предназначены для размещения
заголовков строк и столбцов.
 Component – четыре области этого типа расположены по углам окна.
Определение класса ScrollPaneLayout включает именованные константы,
упрощающие ссылки на существующие элементы компоновки. Например, для ссылок на
угловые области компоновки можно использовать константы LOWER_LEFT_CORNER,
LOWER_RIGHT_CORNER, UPPER_LEFT_CORNER и UPPER_RIGHT_CORNER.
2.4.14.2. Менеджер компоновки ViewportLayout
Каждый компонент JViewport имеет собственный менеджер компоновки
ViewportLayout.
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 17 Прикладное программирование в ТС
Лекция 3-08
Как и в случае компоновки ScrollPaneLayout, нет необходимости явно
указывать в программе, что используется компоновка ViewportLayout. Она
устанавливается автоматически для каждого создаваемого объекта класса JViewport.
Достаточно добавить компонент в объект JViewport и он будет автоматически
размещен менеджером ViewportLayout в соответствии со свойствами данного
контейнера JViewport.
2.3.14.3. Менеджер компоновки OverlayLayout
В компоновке OverlayLayout каждый добавляемый компонент помещается
поверх всех остальных. Общий размер контейнера определяется размерами самого
большого из компонентов.
Конструктор
OverlayLayout(Container target)
создает для контейнера target компоновку с перекрытием компонент.
Методы
public void addLayoutComponent(String name, Component comp)
public void addLayoutComponent(Component comp,
Object constraints)
добавляют соответственно компонент с заданным именем и заданными ограничителями, а
метод
public void removeLayoutComponent(Component comp)
удаляет компонент из контейнера.
Методы
public float getLayoutAlignmentX(Container target)
public float getLayoutAlignmentY(Container target)
позволяют получить выравнивание контейнера по осям x и y.
2.4.14.4. Менеджер компоновки BoxLayout
Компоновка BoxLayout в целом подобна стандартной компоновке библиотеки
AWT FlowLayout, за исключением того, что при работе с новой компоновкой можно
определить используемую ось (с помощью статических переменных класса BoxLayout:
Х_AXIS или Y_AXIS). В отличие от компоновки GridLayout, здесь каждый компонент
может занимать ячейку различного размера. Для использования компоновки BoxLayout
с ориентацией по оси Y достаточно поместить в программу следующий оператор:
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
Если в программе желательно применить компоновку типа BoxLayout, в
качестве контейнера вместо класса JPanel следует использовать класс Box (для этого
класса компоновка BoxLayout используется по умолчанию). Кроме того, класс Box
предоставляет несколько дополнительных методов, обеспечивающих полный контроль
над размещением компонентов в окне.
Так, в число размещаемых на панели компонентов можно включить невидимые
компоненты-заполнители трех видов.
Первый вид заполнителя – невидимая разделительная область (rigid area), имеющая
фиксированные размеры. Она создается с помощью метода
public static Component createRigidArea(Dimension d)
и вставляется между компонентами, создавая промежуток фиксированного размера между
ними.
Заполнитель второго вида – невидимая «распорка» (strut) имеет только один
фиксированный размер. У горизонтальной распорки, создаваемой статическим методом
public static Component createHorizontalStrut(int width)
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 18 Прикладное программирование в ТС
Лекция 3-08
фиксирована только ширина. При горизонтальном расположении компонентов распорку
можно использовать для создания промежутков между компонентами, а при вертикальном
расположении — для задания ширины всей панели.
У вертикальной распорки, создаваемой статическим методом
public static Component createVerticalStrut(int height)
фиксирована высота. Она используется аналогично горизонтальной распорке.
Третий вид заполнителя – невидимая «надувная подушка» (glue), «раздуваясь»,
заполняет все выделенное ей пространство, раздвигая остальные компоненты и прижимая
их к краям панели, если они имеют фиксированный максимальный размер. Этот
заполнитель создается одним из статических методов:
 public static Component createGlue() – «подушка» раздувается во
все стороны;
 public static Component createHorizontalGlue() – «подушка»
раздается в ширину;
 public static Component createVerticalGlue() – «подушка»
раздается в высоту.
Кроме этих трех компонентов-разделителей можно использовать невидимый
компонент с фиксированным минимальным, максимальным и предпочтительным
размерами. Он является объектом класса Filler, вложенного в класс Box, и создается
конструктором
Box.Filler(Dimension min, Dimension pref, Dimension max).
Преимущество этого объекта в том, что он может поменять размеры с помощью
метода
void changeShape(Dimension min, Dimension pref,
Dimension max).
Пример использования менеджера BoxLayout для организации вывода
графических компонентов приведен на рис. 4.30.
Рис. 4.30. Пример использования менеджера BoxLayout
2.4.14.5. Менеджер компоновки SpringLayout
Менеджер компоновки SpringLayout использует для определения положения и
размеров компонента координаты x, у и размеры width, height, задаваемыми
объектами абстрактного класса Spring.
Каждый объект этого класса содержит четыре величины:
минимальный,
максимальный и предпочтительный размеры, а также текущий размер. Эти размеры могут
использоваться как размеры промежутков между компонентами. Объект класса Spring
задается методом
public static Spring constant(int min, int pref, int max),
с заданным минимальным, предпочитаемым и максимальным значениями, а метод
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 19 Прикладное программирование в ТС
Лекция 3-08
public static Spring constant(int size)
возвращает объект класса Spring с совпадающими между собой размерами, равными
size.
Текущий размер value, устанавливается методом
public abstract void setValue(int value).
Минимальный, максимальный, предпочитаемый и текущий размер можно
получить с помощью методов
public abstract int getMinimumValue(),
public abstract int getMaximumValue(),
public abstract int getPreferredValue(),
public abstract int getValue().
При использовании менеджером SpringLayout нескольких объектов класса для
учета их взаимодействия в классе Spring определены несколько методов.
Так, метод
public static Spring max(Spring s1, Spring s2)
возвращает новый объект, размеры которого составлены из наибольших значений
объектов s1 и s2, метод
public static Spring minus(Spring s)
возвращает новый объект, размеры которого равны размерам объекта s с обратным
знаком, а метод
public static Spring sum(Spring s1, Spring s2)
возвращает новый объект, размеры которого равны сумме соответствующих размеров
объектов s1 и s2.
Объект класса Spring используется для построения объекта вложенного класса
SpringLayout.Constraints.
Объект этого класса содержит координаты x и у, ширину width и высоту
height, являющиеся объектами класса Spring. Менеджер размещения SpringLayout
меняет положение левого верхнего угла компонента в заданных объектами x и y
пределах. Поэтому координаты обозначаются статическими строковыми константами
WEST и NORTH класса SpringLayout. Величины x + width и y + height
обозначаются статическими строковыми константами EAST и SOUTH и определяют
положение правого нижнего угла компонента.
Для
получения
и
установки
всех
этих
значений
в
классе
SpringLayout.Constraints определены методы:
 void setX(Spring x)и Spring getX() – установка
и
получение
координаты x;
 void setY(Spring y)и Spring getY() – установка
и
получение
координаты y;
 void setWidth(Spring width)и Spring getWidth() – установка
и
получение ширины;
 void setHeight(Spring height)и Spring getHeight()– установка и
получение высоты.
Методы
public void setConstraint(String edgeName, Spring s)
и
public Spring getConstraint(String edgeName)
устанавливают и выдают объект класса Spring по заданному имени NORTH, WEST,
SOUTH или EAST.
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 20 Прикладное программирование в ТС
Лекция 3-08
Пример использования менеджера SpringLayout для организации вывода пар
надпись – текстовое поле приведен на рис. 4.31.
Рис. 4.31. Пример использования менеджера SpringLayout
2.4.14.6. Менеджер компоновки GroupLayout
Менеджер GroupLayout иерархически группирует компоненты для их
позиционирования в контейнере и поддерживает два типа групп. Группы первого типа
выстраивают свои элементы последовательно, группы второго типа – параллельно
четырьмя разными способами. Группирование выполняется с помощью объектов класса
Group.
Каждая группа может содержать любое количество объектов класса Group или
Component, а также промежуток (gap). Компоненты менеджера похожи на пружины.
Каждый компонент имеет диапазон размеров, задаваемый
минимальным,
предпочитаемым и максимальным размерами, определяемыми с помощью методов
getMinimumSize(), getPreferredSize() и getMaximumSize() класса
Component. Промежуток также рассматривается как невидимый компонент с
минимальным, предпочитаемым и максимальным размером. Кроме того, менеджер
поддерживает предпочитаемый промежуток, который можно получить с помощью метода
getPreferredGap() класса LayoutStyle.
Диапазон для объекта класса определяется типом группы: для последовательных
групп диапазон равен сумме элементов, для параллельных – диапазону для максимального
элемента.
Менеджер GroupLayout рассматривает каждую ось независимо, т.е. существует
группа, представляющая вертикальную ось и группа, представляющая горизонтальную
ось. Вертикальная ось определяет минимальный, предпочитаемый и максимальный
размер по этой оси, установку координаты y и высоты компонент, а горизонтальная ось –
минимальный, предпочитаемый и максимальный размер по этой оси, установку
координаты x и ширины компонент. Каждый компонент должен быть задан и в
вертикальной и в горизонтальной группе.
Конструктор
public GroupLayout(Container host)
задает групповую компоновку для контейнера host.
Метод
public void setAutoCreateGaps(boolean autoCreatePadding)
задает (при значении параметра autoCreatePadding, равном true) или отменяет (при
значении параметра autoCreatePadding, равном false) автоматическую вставку
промежутков между компонентами.
Горизонтальная и вертикальная группы создаются с помощью методов
public void setHorizontalGroup(GroupLayout.Group group)
public void setVerticalGroup(GroupLayout.Group group)
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 21 Прикладное программирование в ТС
Лекция 3-08
Оба эти метода содержат в качестве параметра объект group вложенного класса
Group, который задает позиции и размеры компонент вдоль горизонтальной или
вертикальной оси.
Последовательная или параллельная группы создаются с помощью методов
public GroupLayout.SequentialGroup createSequentialGroup()
public GroupLayout.ParallelGroup createParallelGroup()
public GroupLayout.ParallelGroup createParallelGroup(
GroupLayout.Alignment alignment)
GroupLayout.ParallelGroup createParallelGroup(
GroupLayout.Alignment alignment, boolean resizable)
Предпоследний и последний методы задают (с помощью параметра alignment)
выравнивание компонент в группе с помощью перечислимых переменных класса
GroupLayout.Alignment: LEADING (выравнивание к началу группы), TRAILING
(выравнивание к концу группы), CENTER (выравнивание по центру) и BASELINE
(выравнивание по базовой линии). Последний метод задает также (с помощью параметра
resizable) возможность изменения размера компонента.
Методы
public void linkSize(Component... components)
public void linkSize(int axis, Component... components)
позволяют установить одинаковый размер для всех заданных в качестве параметров
компонент группы (второй метод – только для заданной оси, которая задается
статическими константами HORIZONTAL и VERTICAL класса SwingConstants).
Пример использования менеджера GroupLayout для организации вывода пар
надпись – текстовое поле приведен на рис. 4.32.
Рис. 4.32. Пример использования менеджера GroupLayout
2.4.15. Оформление рамок
Библиотека Swing позволяет не только выводить графические компоненты, но и
задавать для них рамки, используя компоненты пакета javax.swing.border.
Интерфейс Border из этого пакета определяет общие характеристики всех рамок.
В нем заданы следующие методы:
 public void paintBorder(Component c, Graphics g, int x,
int y, int width, int height) – задание рамки с координатами левого верхнего
угла x и y, шириной width и высотой height для компонента с помощью экземпляра g
класса Graphics;
 public boolean isBorderOpaque()– определение прозрачности или
непрозрачности рамки;
 public Insets getBorderInsets(Component c) – определение
пространства, занятого рамкой компонента c.
В последнем методе пространство, занятое рамкой, возвращается в виде
экземпляра класса Insets. В этом классе оно определяется толщиной рамки (в пикселях)
сверху top, слева left, справа right и снизу bottom.
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 22 Прикладное программирование в ТС
Лекция 3-08
Реализацией интерфейса
Border
является
абстрактный
класс
AbstractBorder, в котором добавлен метод
public static Rectangle getInteriorRectangle(Component с,
Border b, int x, int y, int width, int height)
для определения размеров самого компонента без рамки.
Класс AbstractBorder является суперклассом для классов, задающих
различные виды рамок. Самые распространенные виды рамок можно также задать,
используя статические методы класса BorderFactory в пакете javax.swing.
Ниже приведены основные статические методы этого класса для создания рамок
различных типов:
 метод public static Border createEmptyBorder() создает пустую
рамку с нулевыми размерами, а статический метод public static Border
createEmptyBorder (int top, int left, int bottom, int right) –
пустую рамку с заданными размерами;
 методы public static Border createLineBorder(Color color) и
public
static
Border
createLineBorder(Color
color,
int
thickness) создают соответственно рамку с заданным цветом и рамку с заданным
цветом заданной толщины;
 метод public static Border createBevelBorder(int type)
создает рамку заданного типа type (выпуклого – BevelBorder.RAISED или вогнутого
–
BevelBorder.LOWERED),
метод
public
static
Border
createBevelBorder(int type, Color highlight, Color shadow) создает
рамку заданного типа с заданным светлым (highlight) и темным (shadow) цветом, а
метод public static Border createBevelBorder(int type, Color
highlightOuter, Color highlightInner, Color shadowOuter, Color
shadowInner) создает объемную двухцветную рамку заданного типа (внутренние
линии имеют цвета highlightInner и shadowInner, а внешние – цвета
highlightOuter и shadowOuter);
 метод public static Border createEtchedBorder() создает
стандартную «врезанную» рамку с цветами чуть светлее и чуть темнее цвета фона, метод
public
static
Border
createEtchedBorder(int
type)
создает
«врезанную» рамку (если type равен EtchedBorder.RAISED) или «вдавленную» (если
type равен EtchedBorder.LOWERED), метод
public
static
Border
createEtchedBorder(Color highlight, Color shadow) задает цвета
«врезанной рамки», а метод public static Border createEtchedBorder(int
type, Color highlight, Color shadow) объединяет возможности двух
предыдущих методов;
 рамка одного цвета, но из линий разной толщины задается с помощью метода
public static MatteBorder createMatteBorder(int top, int left,
int bottom, int right, Color color), где color – цвет рамки, top, left,
bottom и right – толщина рамки (в пикселях) соответственно сверху, слева, снизу и
справа, а метод public static MatteBorder createMatteBorder(int top,
int left, int bottom, int right, Icon tileIcon) задает в качестве рамки
повторяющееся изображение tileIcon;
 метод public static TitledBorder createTitledBorder(Border
border, String title, int titleJustification, int titlePosition,
Font titleFont, Color titleColor) задает для рамки border надпись title
шрифтом titleFont и цвета titleColor, выровненную по горизонтали в
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 23 Прикладное программирование в ТС
Лекция 3-08
соответствии со значением titleJustification (одна из статических констант класса
TitledBorder:
LEFT,
CENTER,
RIGHT,
LEADING,
TRAILING
или
DEFAULT_JUSTIFICATION – значение LEADING) и по вертикали соответствии со
значением titlePosition (одна из статических констант класса TitledBorder:
ABOVE_TOP, TOP, BELOW_TOP, ABOVE_BOTTOM, BOTTOM, BELOW_BOTTOM или
DEFAULT_POSITION
–
значение
TOP).
Остальные
пять
методов
createTitledBorder() содержат отдельные параметры или часть параметров
приведенного выше метода;
 метод
public
static
CompoundBorder
createCompoundBorder(Border outsideBorder, Border insideBorder)
используется для создания рамки, состоящей из двух вложенных рамок любых типов.
Для создания собственных рамок можно создав собственный класс – либо
наследник непосредственно класса AbstractBorder, либо наследник одного из
дочерних классов этого класса.
Примеры задания рамок для кнопок приведены на рис. 4.33.
Рис. 4.33. Примеры задания рамок
2.4.16. Обработка событий в Swing
В библиотеку Swing входит собственный пакет классов событий
javax.swing.event, содержащий определение событий, специфических для
компонентов Swing. Обычно, для обработки событий необходимо включать и пакет
javax.awt.
Пакет javax.swing.event включает классы прослушивающих блоков и
собственно событий, тогда как источниками событий являются сами компоненты системы
Swing.
Ниже приведен список классов событий Swing и кратко описано их назначение
(DocumentEvent является интерфейсом):
 AncestorEvent – добавление, перемещение или удаление предшествующего
объекта (по терминологии Windows предшествующие объекты – это те члены иерархии
контейнеров, которые расположены над данным объектом вплоть до корневого объекта
окна);
 CaretEvent – перемещение курсора ввода в текстовом поле;
 ChangeEvent – изменение состояния компонента;
 DocumentEvent – изменение состояния документа;
 HyperlinkEvent – некоторое событие, имеющее отношение к гипертекстовой
ссылке;
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 24 Прикладное программирование в ТС
Лекция 3-08
 InternalFrameEvent – событие пакета AWTEvent, дополненное средствами
поддержки объектов JinternalFrame;
 ListDataEvent – изменение состояния списка или добавление/удаление
интервала;
 ListSelectionEvent – изменение состояние выделения в списке;
 MenuEvent – выбор (выделение) или отмена (выделение снято) команды меню;
 PopupMenuEvent – изменение в состоянии всплывающего меню;
 TableColumnModelEvent – изменение модели столбца таблицы;
 TableModelEvent – изменение модели события;
 TreeExpansionEvent – раскрытие или сворачивание узла дерева;
 TreeModelEvent – изменение модели дерева;
 TreeSelectionEvent – изменение состояния выделения объекта дерева;
 UndoableEditEvent – выполнение операции, которая может быть отменена.
Как и аналогичные компоненты библиотеки AWT, блоки прослушивания Swing
представляют собой интерфейсы. Однако, в отличие от библиотеки AWT, в Swing не
введены классы адаптеров. Поэтому при реализации блоков прослушивания обязательно
следует переопределять все их методы. Например, для реализации блока прослушивания
AncestorListener, имеющего три метода, можно использовать следующий оператор:
public class myAncestorListener implements AncestorListener
{
public void ancestorAdded(AncestorEvent e)
{
// Этот метод игнорируется
}
public void ancestorRemoved(AncestorEvent e)
{
// Этот метод также игнорируется
}
public void ancestorMoved(AncestorEvent e)
{
//В этом случае выполняется обработка
}
}
По терминологии Windows предшествующие объекты (ancestors) – это те члены
иерархии контейнеров, которые расположены над данным объектом вплоть до корневого
объекта окна. Предположим, что объект класса JPanel помещен в объект Frame, а в
объект JPanel, в свою очередь, помещен объект JLabel. Наконец, в объект JLabel
помещен объект Icon. Тогда все вышестоящие объекты: JLabel, JPanel и Frame
являются для объекта Icon предшествующими.
События библиотеки Swing порождаются ее компонентами. Так событие
ItemEvent
порождается
объектами
классов
DefaultButtonModel,
AbstractButton и JComboBox, а событие MenuEvent – объектами класса JMenu.
При обработке событий всегда необходимо помнить об иерархии компонентов
событий: событие, посылаемое некоторым компонентом, будет посылаться и любым
производным от него классом.
2.4.17. Изменение внешнего вида компонент
Как указывалось выше, внешний вид компонент Swing и их поведение не зависят
от операционной системы. Более того, внешний вид компонент можно изменить,
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 25 Прикладное программирование в ТС
Лекция 3-08
используя средства Look and Feel (L&F) пакета Swing. Термин Look (впечатление)
относится к внешнему виду компонент, а термин Feel (ощущение) относится к их
поведению.
Стандартными L&F для Swing являются:
 Metal (этот L&F используется по умолчанию и называется Java L&F или просто
JLF);
 Windows (L&F Windows):
 Motif (L&F Linux и Solaris).
Примеры вывода окон и кнопок в этих L&F приведены на рис. 4.34.
а)
б)
в)
Рис. 4.34. Вид окна и кнопки для стандартных L&F: а) Metal; б) Windows; в) Motif;
Кроме того, для платформы Macintosh можно использовать свой L&F (но только
на компьютерах этой платформы).
Для получения текущего L&F и установки своего L&F используются статические
методы класса UIManager из пакета javax.swing. Так, метод
LookAndFeel getLookAndFeel()
позволяет получить текущий L&F как объект класса LookAndFeel, а метод
String getSystemLookAndFeelClassName()
возвращает имя класса, содержащего L&F операционной системы, под управлением
которой работает компьютер.
Методы
void setLookAndFeel(LookAndFeel newLookAndFeel)
и
void setLookAndFeel(String className)
устанавливают L&F в соответствии с заданным объектом класса LookAndFeel или
заданным именем класса. Например, оператор
UIManager.setLookAndFeel(getSystemLookAndFeelClassName());
устанавливает для графической программы, вместо L&F по умолчанию,
L&F
операционной системы.
По умолчанию окно класса JFrame или JDialog, имеет L&F той операционной
системы, под управлением которой запущена программа. Для Windows окна будут
выводиться так, как показано на рис. 4.34б и рис. 4.34в. Чтобы изменить L&F
операционной системы на L&F по умолчанию, необходимо использовать метод
public static void setDefaultLookAndFeelDecorated(
boolean defaultLookAndFeelDecorated)
в классах JFrame и JDialog, задав в качестве параметра значение true, например:
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Окно текущего L&F");
В этом случае окно будет выводиться так, как показано на рис. 4.34а.
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 26 Прикладное программирование в ТС
Лекция 3-08
Для одного L&F можно создать несколько разновидностей (тем). Каждая тема
характеризуется тремя основными (primary) и тремя дополнительными (secondary)
цветами фона, а также шрифтами для вывода различных элементов окна. Так, в пакете
javax.swing.plaf.metal для L&F Metal определены две темы: тема по умолчанию
(Default Metal), определенная в классе DefaultMetalTheme и тема Ocean,
определенная в классе OceanTheme, расширяющим класс DefaultMetalTheme. В
старых версиях JDK использовалась тема по умолчанию (серый цвет фона окна и кнопок),
однако, начиная с Java SE 5, темой по умолчанию является Ocean, показанная на рис.
4.34а.
Можно создать свою тему с помощью класса-наследника, и изменить
характеристики темы, переопределив методы DefaultMetalTheme, получающие
характеристики шрифтов.
Для получения значений свойств компонент (цвета, рамок, границ и т.д.) для
текущего L&F можно использовать статические методы класса UIManager в пакете
javax.swing. Так, чтобы получить шрифт, используемый в каком-либо компоненте по
умолчанию надо воспользоваться методом:
static Font getFont(Object key)
где параметр key – наименование характеристики компонента.
Например, имя шрифта textFieldFontName, используемого по умолчанию в
текстовом поле, можно получить с помощью следующих операторов:
Font textFieldFont = UIManager.getFont("TextField.font");
String textFieldFontName = textFieldFont.getName();
Чтобы изменить значение какого-либо свойства компонента L&F, надо сначала
создать объект для этого свойства, используя один из классов пакета
javax.swing.plaf.
Изменить значение какого-либо свойства компонента можно с помощью метода
static Object put(Object key, Object value)
класса UIManager.
Так, для нового шрифта текстового поля по умолчанию надо сгенерировать объект
класса и затем изменить его значение по умолчанию:
FontUIResource newFont =
new FontUIResource("Arial",Font.PLAIN,12);
UIManager.put("TextField.font", newFont);
Чтобы изменения были произведены, необходимо добавить блок прослушивания
для интерфейса PropertyChangeListener с помощью метода
static void addPropertyChangeListener(
PropertyChangeListener listener)
класса UIManager и в методе propertyChange() интерфейса вызвать метод
static void updateComponentTreeUI(Component c)
класса SwingUtilities из пакета javax.swing для обновляемого компонента c.
Так, для фиксации изменений шрифта надо задать следующую последовательность
операторов:
Container contentPane = getContentPane();
…
UIManager.addPropertyChangeListener(
new PropertyChangeListener() {
void propertyChange(PropertyChangeEvent evt) {
SwingUtilities.updateComponentTreeUI(
contentPane);
}
}
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
- 27 Прикладное программирование в ТС
Лекция 3-08
);
Наряду с основным L&F, в программе можно использовать дополнительные L&F.
Объекты графического интерфейса, в которых скомбинировано несколько L&F, можно
создать с помощью классов пакета javax.swing.plaf.multi и созданных на их
основе наследников классов этого пакета.
Начиная с Java SE 5, можно использовать более удобный способ изменения
графических компонент L&F, с помощью интерфейса SynthConstants и классов,
реализованных в пакете javax.swing.plaf.synth.
Графический компонент при использовании интерфейса SynthConstants
представляется как один или несколько областей (regions), каждая из которых
характеризуется своим стилем (для доступа к стилям используются методы класса
SynthStyle). Для рисования областей графических объектов используются методы
класса SynthPainter. Новый L&F создается как объект класса SynthLookAndFeel.
Его можно задать либо с помощью метода setStyleFactory() класса
SynthLookAndFeel, либо задать в файле формата XML (eXtended Markup Language –
расширенный язык разметки). Правила записи элементов и их атрибутов в этом файле
задаются в специальном файле в формате DTD (Data Type Definition – определение типа
данных).
Файл: 681454316 Создан: 09.07.2007 Модифицирован: 29.04.2016
Автор: Шонин В.А.
Download