ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 08.11.2023
Просмотров: 166
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
3.1.7.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.
Для обработки событий в объектах класса JButton можно использовать интерфейс ActionListener и класс ActionEvent. Однако обычно с текстовыми компонентами связана кнопка, для которой и выполняется обработка события.
3.1.8. Меню
Компоненты JMenuBar, JMenu, JMenuItem и JCheckBoxMenuItem в Swing по своим функциональным возможностям и использованию аналогичны компонентам MenuBar, Menu, MenuItem и CheckboxMenuItem, используемым в AWT.
Новый компонент JRadioButtonMenuItem позволяет организовать в меню переключатели. Группа альтернативных переключателей формируется следующим образом: сначала создается объект класса ButtonGroup, а затем в этот объект с помощью метода add() добавляются объекты класса JRadioButtonMenuItem.
Классы, реализующие меню в Swing, отличаются от соответствующих классов AWT следующими основными особенностями:
-
поскольку все классы, кроме 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);
-
для пунктов меню введен интерфейс 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)
позволяет организовать обработку событий, связанных с нажатием и отпусканием, а также отдельно с нажатием и отдельно с отпусканием клавиш, связанных с пунктами меню.
3.1.9. Бегунки и подсказки
3.1.9.1. Классы 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 и класс ChangeEvent.
3.1.9.2. Класс 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()
позволяют установить и получить подсказку непосредственно для любого графического компонента.
3.1.10. Оформление рамок
Каждый стандартный графический компонент в Java содержится в прямоугольной области на экране со сторонами, параллельными сторонам экрана. Для некоторых графических компонент стороны этого прямоугольника выделяются каким-то образом. Так, например, стороны кнопки класса JButton нарисованы так, что создают впечатление ее выпуклости. При нажатии кнопки мыши на ней графическое оформление сторон кнопки JButton меняется, создавая впечатление ее «вдавленности».
Библиотека Swing позволяет изменить оформление границ любого компонента, в том числе и контейнера с помощью рамок разного вида.
Самые общие характеристики всех рамок описаны интерфейсом
Border из пакета javax.swing.border. Вычерчивание рамки выполняется методом
public void paintBorder(Component c, Graphics g,
int x, int y, int width, int height);
Здесь задается компонент c, который обводится рамкой, экземпляр g класса Graphics, обладающего методами рисования, и размеры рамки, которые обычно совпадают с размерами компонента, либо чуть больше или чуть меньше их.
Рамка может быть прозрачной или непрозрачной. Это отмечается логическим методом
public boolean isBorderOpaque().
Третий и последний метод интерфейса
public Insets getBorderInsets(Component c)
возвращает пространство, занятое рамкой данного компонента c, в виде экземпляра класса Insets. В классе Insets это пространство определяется толщиной рамки сверху top, слева left, справа right и снизу bottom. Все четыре поля класса Insets являются целочисленными переменными.
который можно использовать для определения размеров самого компонента без рамки.
Класс AbstractBorder расширяют около двадцати классов, вычерчивающих самые разнообразные рамки. Для удобства работы с ними в пакете javax.swing есть класс BorderFactory, в котором собраны статические методы вида createXxxBorder() для разных типов рамок с разными параметрами. Чаще всего для создания рамки достаточно воспользоваться одним из этих методов, а затем установить полученную рамку в компонент методом
public void setBorder(Border border)
класса JComponent, например:
JLabel myLabel = new JLabel(
"Надпись с толстой синей рамкой");
myLabel.setBorder(BorderFactory.createLineBorder(
Color.blue, 3));
Ниже приведены основные статические методы класса BorderFactory для создания рамок различных типов:
-
метод 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, выровненную по горизонтали в соответствии со значением 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) используется для создания рамки, состоящей из двух вложенных рамок любых типов.
Хотя библиотека Swing предоставляет множество готовых рамок и класс BorderFactory для их быстрого создания, часто возникает необходимость сконструировать оригинальную рамку.
Для ее создания можно расширить абстрактный класс AbstractBorder, определив хотя бы один конструктор, и переопределив методы paintBorder() и getBorderInsets(). Если рамка непрозрачна, то надо переопределить метод isBorderOpaque() так, чтобы он возвращал true.
Свою рамку можно создать, расширив какой-либо класс рамок, например, для рамки, расширяющей класс TitledBorder, в заголовок можно вставить не надпись, а компонент класса JComponent.