События и их обработка
Современный подход к обработке событий в Java основан на модели делегирования событий. В этой модели имеется блок прослушивания события (Listener), который ждет поступления события от источника, после чего обрабатывает его и возвращает управление. Источник – это объект, который генерирует событие, если изменяется его внутреннее состояние. Блоки прослушивания представляют собой объекты классов, которые создаются путём реализации интерфейсов прослушивания событий, определённых пакетом java.awt.event. Соответствующие методы объявленные в используемых интерфейсах, необходимо явно реализовать при создании собственных классов прослушивания.
Когда событие происходит, все зарегистрированные блоки прослушивания уведомляются и принимают копию объекта события. Источник вызывает метод объекта, являющегося блоком прослушивания и передает объект события в качестве параметра.
В таблице приведены некоторые интерфейсы и вызываемые методы, реализуемые в блоках прослушивания событий:
Таблица 1 – Типы событий и их методы
ActionListener | actionPerformed(ActionEvent e) |
AdjustmentListener | adjustmentValueChanged(AdjustmentEvent e) |
ComponentListener | componentResized(ComponentEvent e) componentMoved(ComponentEvent e) componentShown(ComponentEvent e) componentHidden(ComponentEvent e) |
ContainerListener | componentAdded(ContainerEvent e) componentRemoved(ContainerEvent e) |
FocusListener | focusGained(FocusEvent e) focusLost(FocusEvent e) |
ItemListener | itemStateChanged(ItemEvent e) |
KeyListener | keyPressed(KeyEvent e) keyReleased(KeyEvent e) keyTyped(KeyEvent e) |
MouseListener | mouseClicked(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) |
MouseMotionListener | museDragged(MouseEvent e) museMoved(MouseEvent e) |
TextListener | textValueChanged(TextEvent e) |
WindowListener | windowOpened(WindowEvent e) windowClosing(WindowEvent e) windowClosed(WindowEvent e) windowIconified(WindowEvent e) windowDeiconified(WindowEvent e) windowActivated(WindowEvent e) |
Событие – это объект класса событий, который описывает состояние источника. В корне иерархии классов событий находится суперкласс EventObjectиз пакетаjava.util. Этот класс содержит два метода:getSource(), возвращающий источник событий, и toString(), возвращающий строчный эквивалент события. Подкласс AWTEventиз пакета java.awtявляется суперклассом всех AWT-событий. МетодgetID()определяет тип события, возникающего вследствие действий пользователя в визуальном приложении, а именно:
ActionEvent- генерируется при нажатии кнопки, двойном щелчке клавишей мыши по элементам списка, при выборе пункта меню;
AdjustmentEvent – генерируется при изменении полосы прокрутки;
ComponentEvent - генерируется, если компонент скрыт, перемещен, изменен в размере или становится видимым;
FocusEvent - генерируется, если компонент получает или теряет фокус ввода и т.д.
Класс InputEventявляется абстрактным суперклассом событий ввода (клавиатуры или мыши). Чтобы рассмотреть события, связанные с обработкой событий клавиатуры, необходимо реализовать интерфейс KeyListener,т.е. определить три метода, объявленные в этом интерфейсе. При нажатии клавиши генерируется событие со значением KEY_PRESSED. Это приводит к запросу обработчика событий keyPressed(). Когда клавиша отпускается, генерируется событие со значением KEY_RELEASED и выполняется обработчикkeyReleased(). Если нажатием клавиши сгенерирован символ, то посылается уведомление о событии со значением KEY_TYPEDи вызывается обработчик keyTyped().
Для регистрации события приложение-источник должно вызвать метод, регистрирующий блок прослушивания этого события. Форма метода:
public void addТипListener(ТипListener el)
Здесь el – ссылка на блок прослушивания события, объект, получающий уведомление о событии. Здесь Тип – имя события, например: addKeyListener()–прослушивание событий клавиатуры.
/* пример # 1 : обработка событий клавиатуры : MyKey.java */
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class MyKey extends Applet implements KeyListener {
String msg = " ";
int x = 0, y = 20; //координаты вывода
public void init() {
addKeyListener(this); /*регистрация данного класса в качестве блока прослушивания */
requestFocus(); //запрос фокуса ввода
}
//реализация всех трех методов интерфейса KeyListener
public void keyPressed(KeyEvent e) {
showStatus("Key Down");
} //отображение в строке состояния
public void keyReleased(KeyEvent e) {
showStatus("Key Up");
} //отображение в строке состояния
public void keyTyped(KeyEvent e) {
msg += e.getKeyChar();
repaint();//перерисовать
}
public void paint(Graphics g) {
g.drawString(msg, x, y);
} //значение клавиши в позиции вывода
}
Коды специальных клавиш (перемещение курсора, функциональных клавиш) недоступны через keyTyped(), для обработки нажатия этих клавиш используется методkeyPressed().
Для того чтобы не реализовывать все методы из соответствующих интерфейсов при создании классов – блоков прослушивания событий, используются классы – адаптеры. Эти классысодержат пустую реализацию всех методов из интерфейсов прослушивания событий, которые они расширяют. При этом определяется новый класс, действующий как блок прослушивания событий, который расширяет один из имеющихся адаптеров и реализует только те события, которые требуется обрабатывать.
Например, класс MouseMotionAdapterимеет два метода:mouseDragged()иmouseMoved(). Сигнатуры этих пустых методов точно такие же, как в интерфейсе MouseMotionListener. Если существует заинтересованность только в событиях перетаскивания мыши, то можно просто расширить адаптер MouseMotionAdapter и переопределить метод mouseDragged()в своем классе. Событие же перемещения мыши обрабатывала бы реализация метода mouseMoved(),которую можно оставить пустой.
В ранних (1.0.x) версиях Java использовались “тяжелые” компоненты AWT, связанные с аппаратными платформами и имеющие ограниченные возможности. Дальнейшее развертывание концепции “write once, run everywhere” (“написать однажды, запускать везде”) привело к тому, что в версии 1.1.x наметился переход к таким компонентам, которые бы не были завязаны на конкретные “железо” и операционные системы. Такого рода классы компонентов, написанные на Java, были объединены в библиотеку под названием Swing. Эти классы доступны разработчикам в составе как JDK, так и отдельного продукта JFC (Java Foundation Classes). Причем для совместимости со старыми версиями JDK старые компоненты из AWT остались нетронутыми, хотя компания JavaSoft, отвечающая за выпуск JDK, рекомендует не смешивать в одной и той же программе старые и новые компоненты. Кроме пакета Swing указанные библиотеки содержат большое число компонентов JavaBeans, которые могут использоваться как для ручной, так и для визуальной разработки пользовательских интерфейсов.
Перед использованием управляющих компонентов (например кнопок) их надо расположить на форме в нужном порядке. Java для этого использует менеджеры размещения. Они определяют способ, который панель использует, для задания порядка размещения управляющего элемента на форме. Менеджеры размещения контролируют, как выполняется позиционирование компонентов, добавляемых в окна, а также их упорядочение. Если пользователь изменяет размер окна, менеджер размещения переупорядочивает компоненты в новой области так, чтобы они оставались видимыми и в то же время сохранили свои позиции относительно друг друга.
Менеджер размещения представляет собой интерфейс LayoutManager, реализованный в виде классов, например: FlowLayout, BorderLayout, GridLayout, CardLayout, BoxLayout и т. д.
FlowLayout– менеджер поточной компоновки. При этом компоненты размещаются от левого верхнего угла окна, слева направо и сверху вниз, как и обычный текст. Этот менеджер используется по умолчанию при добавлении компонентов в апплеты. При использовании библиотеки AWT менеджер FlowLayoutпредставляет собой класс, объявленный следующим образом:
public class FlowLayout extends Object
implements LayoutManager, Serializable { }
/* пример # 1 : поточная компоновка по центру:
FlowLayoutEx.java */
import java.applet.*;
import java.awt.*;
public class FlowLayoutEx extends Applet {
Component c[] = new Component[6];
public void init() {
String[] msg = {"Метка 1", "Метка 2", "Метка 3"};
String[] str = { "--1--", "--2--", "--3--" };
setLayout(new FlowLayout());//по умолчанию
setBackground(Color.gray);
setForeground(Color.getHSBColor(1f, 1f, 1f));
for (int i = 0; i < c.length - 3; i++) {
c[i] = new Button(str[i]);
add(c[i]);
c[i + 3] = new Label(msg[i]);
add(c[i + 3]);
}
setSize(220, 150);
}
}
Метод setLayout(LayoutManager mgr) устанавливает менеджер размещения для данного контейнера. Результаты работы апплета приведены на рисунке.
Рис. 13.1. Размещение компонентов FlowLayout
BorderLayout позволяет позиционировать элементы в областях фиксированного размера, граничащих со сторонами фрейма, которые обозначаются параметрами: NORTH, SOUTH, EAST, WEST. Остальное пространство обозначается как CENTER.
/* пример # 2 : фиксированная компоновка по областям: BorderLayoutEx.java */
import java.applet.*;
import java.awt.*;
public class BorderLayoutEx extends Applet {
public void init() {
setLayout(new BorderLayout());
add(new Button("--0--"), BorderLayout.WEST);
add(new Button("--1--"), BorderLayout.WEST);
//кнопка --1-- будет нарисована поверх кнопки --0--
add(new Button("--2--"), BorderLayout.SOUTH);
add(new Button("--3--"), BorderLayout.EAST);
add(new Label("*BorderLayout*"),
BorderLayout.CENTER);
add(new Checkbox("Выбор"), BorderLayout.NORTH);
setSize(220, 150);
}
}
Рис. 13.2. Размещение компонентов BorderLayout
CardLayout создает вкладки, содержимое которых отображается при выполнении щелчка на заголовке. Каждое размещение можно представлять отдельной пронумерованной картой в колоде, которая может быть перетасована так, чтобы в данный момент наверху находилась любая карта.
Рис. 13.4. Размещение компонентов GridLayout
Дата добавления: 2015-04-05; просмотров: 1155;