• Источник генерирует событие и посылает его одному или нескольким слушателям.
• Слушатель просто ждет поступления события.
• Получив событие, слушатель обрабатывает его и затем возвращает управление.
• Слушатели должны зарегистрироваться у источника – события посылаются только зарегистрировавшимся слушателям.
• Логика когда, обрабатывающего события, отделена от логики интерфейса, генерирующего события.
Событие
Событие – это объект, описывающий изменение состояния источника. В модели обработки событий Java разным типам событий соответствуют различные классы Java. Каждое событие является подклассом класса java.util.EventObject. События пакета AWT являются подклассом java.awt.AWTEvent. Для удобства события различных типов пакета AWT (например, MouseEvent или АсtionEvent) помещены в новый пакет java.awt.event. Для каждого события существует порождающий его объект, который можно получить с помощью метода public Object getSource(), и каждому событию пакета AWT соответствует определенный идентификатор, который позволяет получить метод public int getID(). Это значение используется для того, чтобы отличать события различных типов, которые могут описываться одним и тем же классом событий. Например, для класса FocusEvent возможны два типа событий: FocusEvent.FOCUS_GAINED и FocusEvent.FOCUS_LOST.
Источник
• Источник – объект, генерирующий события. Источник может генерировать несколько типов событий.
• Регистрация слушателя:
public void addTypeListener ( Type Listener el ) throws java . util . TooManyListenersException
public void removeTypeListener ( Type Listener el )
Слушатель
• Слушатель – объект, получающий уведомление о событии.
• Может быть зарегистрирован одним или несколькими источниками.
• Должен реализовывать методы для приема и обработки уведомлений.
• Существует набор интерфейсов TypeListener, описывающих методы обработки событий. Например, объекты слушателей событий ActionEvent должны реализовывать интерфейс ActionListener. В пакете java.awt.event содержатся интерфейсы слушателей для каждого из определенных в нем типов событий (например, для событий MouseEvent здесь определено два интерфейса слушателей: MouseListener и MouseMotionListener). Все интерфейсы слушателей событий являются расширениями интерфейса java.util.EventListener. В этом интерфейсе не определяется ни один из методов, но он играет роль интерфейса-метки, в котором однозначно определены все слушатели событий как таковые.
Таблица 17. Элементы AWT и порождаемые события
Элемент | Событие | Значение |
Component | ComponentEvent | Элемент либо перемещен, либо он стал скрытым, либо видимым |
FocusEvent | Элемент получил или потерял фокус ввода | |
KeyEvent | Пользователь нажал или отпустил клавишу | |
MouseEvent, MouseMotionEvent | Пользователь нажал или отпустил кнопку мыши, либо курсор мыши вошел или покинул область, занимаемую элементом, либо пользователь просто переместил мышь или переместил мышь при нажатой кнопке мыши | |
Button | ActionEvent | Пользователь нажал кнопку |
Checkbox | ItemEvent | Пользователь установил или сбросил флажок |
CheckboxMenuItem | ItemEvent | Пользователь установил или сбросил флажок рядом с пунктом меню |
Choice | ItemEvent | Пользователь выбрал элемент списка или отменил его выбор |
Container | ContainerEvent | Элемент добавлен в контейнер или удален из него |
List | ActionEvent ItemEvent | Пользователь выполнил двойной щелчок мыши на элементе списка Пользователь выбрал элемент списка или отменил выбор |
MenuItem | ActionEvent | Пользователь выбрал пункт меню |
Scrollbar | AdjustmentEvent | Пользователь осуществил прокрутку |
TextComponent | TextEvent | Пользователь внес изменения в текст элемента |
TextField | ActionEvent | Пользователь закончил редактирование текста элемента |
Window | WindowEvent | Окно было открыто, закрыто, представлено в виде пиктограммы, восстановлено или требует восстановления |
Таблица 18. События, слушатели и методы
Класс события | Интерфейс слушателя | Методы слушателя |
ActionEvent | ActionListener | actionPerformed() |
AdjustmentEvent | AdjustmentListener | adjustmentValueChanged() |
ComponentEvent | ComponentListener | componentHidden() componentMoved() componentResized() componentShown() |
ContainerEvent | ContainerListener | componentAdded() componentRemoved() |
FocusEvent | FocusListener | focusGained() focusLost () |
ItemEvent | ItemListener | itemStateChanged() |
KeyEvent | KeyListener | keyPressed() keyReleased() keyTyped() |
MouseEvent | MouseListener | mouseClicked() mouseEntered() mouseExited() mousePressed() mouseReleased() |
MouseMotionEvent | MouseMotionListener | mouseDragged() mouseMoved() |
TextEvent | TextListener | textValueChanged() |
WindowEvent | WindowListener | windowActivated() windowClosed() windowClosing() windowDeactivated() windowDeiconified() windowlconified() windowOpened() |
Классы-адаптеры
Для каждого интерфейса слушателей событий, содержащего несколько методов, в пакете java.awt.event определен простой класс-адаптер, который обеспечивает пустое тело для каждого из методов соответствующего интерфейса. Когда нужен только один или два таких метода, иногда проще получить подкласс класса-адаптера, чем реализовать интерфейс самостоятельно. При получении подкласса адаптера требуется лишь переопределить те методы, которые нужны, а при прямой реализации интерфейса необходимо определить все методы, в том числе и ненужные в данной программе. Заранее определенные классы-адаптеры называются так же, как и интерфейсы, которые они реализуют, но в этих названиях Listener заменяется на Adapter: MouseAdapter, WindowAdapter и т.д.
Пример обработки событий представлен примером 55.
Пример 55.
/* <applet code = "Scribble2" height=480> </applet> */
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Scribble2 extends Applet implements
MouseListener, MouseMotionListener {
private int last_x, last_y;
public void init() {
this.addMouseListener(this) ;
this.addMouseMotionListener(this);
}
public void mousePressed(MouseEvent e) {
last_x = e.getX();
last_y = e.getY();
}
public void mouseDragged(MouseEvent e) {
Graphics g = this.getGraphics();
int x = e.getX(), y = e.getY();
g.drawLine(last_x, last_y, x, y);
last_x = x; last_y = y;
}
public void mouseReleased(MouseEvent e) {;}
public void mouseClicked(MouseEvent e) {;}
public void mouseEntered(MouseEvent e) {;}
public void mouseExited(MouseEvent e) {;}
public void mouseMoved(MouseEvent e) {;}
}
Результат работы примера 55 – рисунок 33.
Рисунок 33. Результат работы примера 55.
Дата: 2019-02-19, просмотров: 280.