Java Advanced Интерфейс пользователя Часть 2
2 СПбГУ ИТМО Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Содержание 1.События и слушатели 2.Кнопки и действия 3.Управление с клавиатуры 4.Управление фокусом 5.Look and Feel 6.Заключение
События и слушатели Часть 1
4Georgiy KorneevJava Advanced / Интерфейс пользователя 2 События Информация об изменении состояния Корневой класс EventObject Подклассы XXXEvent Методы Object getSource() – инициатор события
5Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Классификация событий Низкоуровневые события Создаются системой на основе действий пользователя Инициатор события – текущая компонента Высокоуровневые события Создаются компонентами на основе других событий Инициатор события – компонента создавшая событие
6Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Слушатели Оповещаются о возникновении события Интерфейсы XXXListener Управление слушателями Метод addXXXListener(XXXListener listener) – добавить слушателя Метод removeXXXListener(XXXListener listener) – убрать слушателя
7Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Обработка событий Низкоуровневые события Высокоуровневые события
8Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Низкоуровневые события Ввод пользователя InputEvent – базовый класс KeyEvent – событие клавиатуры MouseEvent – событие мыши MouseWheelEvent – событие колеса прокрутки Изменение состояния компоненты ComponentEvent – изменение видимости / размера / местоположения компонента FocusEvent – изменение фокуса ContainerEvent – добавление / удаление компонент WindowEvent – операции с окнами
9Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Обработка низкоуровневых событий Генерация событий Клавиатурные – для компоненты владеющей фокусом Мыши – для компоненты, над которой находится мышь Прочие – для компоненты с которой произошли Событие ввода может быть поглощено Метод consume()
10Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Высокоуровневые события Примеры ActionEvent – нажатие на кнопку MenuEvent – операции с меню PopupMenuEvent – операции с всплывающим меню …
11Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Подтипы событий Событие может иметь несколько подтипов, для которых у слушателя вызываются разные методы Пример Событие KeyEvent Класс KeyListener Метод keyTyped(KeyEvent) Метод keyPressed(KeyEvent) Метод keyReleased(KeyEvent)
12Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Создание слушателей Реализация слушателя 1. Реализовать интерфейс 2. Добавить слушателя к компоненту 3. Реагировать на события Вспомогательные классы XXXAdapter – для реализации слушателей с несколькими методами
13Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Пример слушателя Проверка нажатия клавиши F1 public class F1EventListener extends KeyAdapter implements KeyListener { public void keyTyped(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_F1 && e.getModifiers() == 0) { // Нажата клавиша F1 }
Кнопки и действия Часть 2
15Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Типы кнопок AbstractButton Базовый класс JButton Простая кнопка JToggleButton Кнопка с двумя состояниями JCheckBox Кнопка с флажком JRadioButton Кнопка переключатель JMenuItem Элемент меню
16Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Нажатие на кнопку Событие ActionEvent Свойства getActionCommand() – название команды getModifiers() – состояние клавиш-модификаторов getWhen() – когда произошло Слушатель ActionListener Метод actionPerformed(ActionEvent e)
17Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Базовый класс для кнопок (1) Класс AbstractButton Конструкторы AbstractButton() – конструктор по умолчанию Методы doClick() – нажать на кнопку isSelected() – состояние кнопки
18Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Базовый класс кнопок (2) Свойства action – ассоциированное действие actionCommand – название команды label – надпись на кнопке enabled – разрешено ли нажимать icon, disabledIcon, pressedIcon – иконки horizontal(vertical)Alignment – выравнивание текста и иконки horizontal(vertical)TextPosition – положение текста относительно иконки margin -- отступы
19Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Обыкновенные кнопки Класс JButton Конструкторы JButton(text?, icon?) Методы JRootPane.setDefaultButton(JButton) – устанавливает кнопку по умолчанию
20Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Кнопки с флажком Класс JCheckBox Конструкторы JCheckBox(text?, icon?, selected?)
21Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Кнопки-переключатели Класс JRadioButton Конструкторы JCheckBox(text?, icon?, selected?)
22Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Группы кнопок Класс ButtonGroup – набор кнопок Только одна из кнопок может быть выбрана Методы add(AbstractButton) – добавить кнопку в группу remove(AbstractButton) – удалить кнопку из группы getButtonCount() – количество кнопок в группе
23Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Действия Действие – абстракция действия которое можно произвести Интерфейс Action Методы actionPerformed(ActionEvent) – совершить действие setEnabled(boolean) – запретить / разрешить isEnabled() – проверить разрешение putValue(key, value) – записать значение свойства getValue(key) – прочитать значение свойства
24Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Свойства действий Константы интерфейса Action NAME – название действия SHORT_DESCRIPTION –описание для всплывающих подсказок LONG_DESCRIPTION –описание для контекстной помощи ACTION_COMMAND_KEY – имя команды SMALL_ICON – иконка
25Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Применение действий По действию можно создавать элементы управления
26Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Пример действия Открытие директории для просмотра public class OpenAction extends AbstractAction { public OpenAction() { super("Open"); putValue(SHORT_DESCRIPTION, "Open a directory"); putValue(SMALL_ICON, loadIcon("load16.gif")); } public void actionPerformed(ActionEvent e) { // Open directory }
Управление с клавиатуры Часть 3
28Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Мнемоники Клавиши быстрого перехода Под Windows символ подчеркивается, используется комбинация Alt + Клавиша Методы AbstractButton.setMnemonics(key) – установить мнемонику для кнопки JLabel.setDisplayedMnemonicIndex(index) – установить номер символа, подсвечиваемого как мнемоника
29Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Горячие клавиши (акселераторы) Отображение клавиш на названия действий Класс InputMap Отображения названий действий на действия Класс ActionMap
30Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Отображение клавиш на названия (1) Каждая компонента имеет три InputMap WHEN_FOCUSED – применяется когда компонента имеет фокус WHEN_ANCESTOR_OF_FOCUSED_COMPONENT – применяется когда фокус имеет вложенная компонента WHEN_IN_FOCUSED_WINDOW – применяется когда фокус у компоненты в том же окне Методы JComponent getInputMap() – получить WHEN_FOCUSED getInputMap(int type) – получить по типу
31Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Отображение клавиш на названия (2) Методы InputMap put(KeyStroke, actionName) – установить отображение get(KeyStroke) – отобразить size() – размер отображения clear() – очистить отображение Свойства InputMap InputMap parent – родительский InputMap
32Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Отображение названий на действия Каждая компонента имеет ActionMap Получение ActionMap JComponent.getActionMap() Методы ActionMap put(actionName, Action) – установить отображение get(actionName) – отобразить size() – размер отображения clear() – очистить отображение
33Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Пример: горячие клавиши Привязка gotoTextAction к Alt+T frame.getRootPane().getInputMap( JComponent.WHEN_IN_FOCUSED_WINDOW ).put( KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.ALT_MASK), "gotoText" ); frame.getRootPane().getActionMap().put( "gotoText", gotoTextAction);
Управление фокусом Часть 4
35Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Получение информации о фокусе Событие FocusEvent Класс FocusEventListener Методы focusGained(FocusEvent) – фокус получен focusLost(FocusEvent) – фокус потерян
36Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Операции с фокусом Методы Component requestFocus() – попытаться сделать окно активным и получить фокус requestFocusInWindow() – получить фокус в окне isFocusOwner() – владеет ли фокусом
37Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Циклы фокусов Операции с фокусом next – следующий компонент в цикле previous – предыдущий компонент в цикле upCycle – выйти на цикл выше downCycle – войти на цикл ниже Метод isFocusCycleRoot() – является ли корнем цикла
38Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Управление фокусом Класс KeyboardFocusManager Методы focusNext(Previous)Component() – передача фокуса следующему (предыдущему) компоненту up(down)FocusCycle() – передача фокуса вверх (вниз) Получение getCurrentKeyboardFocusManager() – для текущего потока
39Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Глобальаня информация о фокусе Класс KeyboardFocusManager Методы getFocusOwner() – текущий владелец фокуса getPermanenFocusOwner() – постоянный владелец фокуса getFocusedWindow() – окно владеющее фокусом
40Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Перехват ввода с клавиатуры Класс KeyboardFocusManager Методы processKeyEvent(Component, KeyEvent) – обработать событие клавиатуры до компонента postProcessKeyEvent(Component, KeyEvent) – обработать событие клавиатуры после компонента
41Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Управление передачей фокуса Класс FocusTraversalPolicy Методы getFirst(Last)Component(Container root) – первая / последняя компонента getComponentAfter(Before)(Container root) – следующая (предыдущая) компонента getDefaultComponent(Container root) – компонента по умолчанию Свойства JComponent focusTraversalPolicy – метод передачи фокуса
42Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Способы передачи фокуса Классы ContainerOrderFocusTraversalPolicy – по порядку компонент в контейнере DefaultFocusTraversalPolicy – по порядку компонент в контейнере SortingFocusTraversalPolicy – сортирует компоненты компаратором LayoutFocusTraversalPolicy – сортирует компоненты по местоположению
43Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Проверка ввода Класс InputVerifier Методы boolean verify(JComponent) – проверить ввод Свойства JComponent inputVerifier – проверщик ввода
Look and Feel Часть 5
45Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Look and Feel Как приложение выглядит и реагирует на ввод пользователя Идентифицируется именем корневого класса Класс UIManager Методы setLookAndFeel(className) – установить L&F getSystemLookAndFeelClassName() – получить имя L&F по умолчанию getInstalledLookAndFeels() – массив загруженных L&F
46Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Пример: Смена L&F Установка Windows L&F try { UIManager.setLookAndFeel("com.sun.java" + ".swing.plaf.windows.WindowsLookAndFeel"); // Обновление L&F окна SwingUtilities.updateComponentTreeUI(this); } catch (Exception e) { System.err.println("Cannot set look and feel: " + e.getMessage()); }
47Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Установка L&F при запуске Установка Windows L&F java -Dswing.defaultlaf=com.sun.java.swing.plaf. windows.WindowsLookAndFeel …
Заключение Часть 6
49Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Ссылки Creating a GUI with JFC/Swing (Tutorial) // Java Foundation Classes // Swing Connection //
50 СПбГУ ИТМО Georgiy KorneevJava Advanced / Интерфейс пользователя 2 Вопросы