Модель делегирования обработки событий
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

• Источник генерирует событие и посылает его одному или нескольким слушателям.

• Слушатель просто ждет поступления события.

• Получив событие, слушатель обрабатывает его и затем возвращает управление.

• Слушатели должны зарегистрироваться у источника – события посылаются только зарегистрировавшимся слушателям.

• Логика когда, обрабатывающего события, отделена от логики интерфейса, генерирующего события.

Событие

Событие – это объект, описывающий изменение состояния источника. В модели обработки событий 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, просмотров: 240.