События, получатели запросов и классы адаптеров

Сигнал о событии JavaBean отправляется при выполнении какой-либо операции (такой, как нажатие на кнопку или закрытие окна). Визуальный редактор для Java отображает события в панели объектов Java, и с помощью этой панели вы можете добавлять и удалять события.

Список возможных событий JavaBean определяется в классе BeanInfo, который также управляет часто используемыми и приоритетными событиями.

Для выполнения дополнительных действий при генерации JavaBean можно добавить в него событие. Например, это может быть обновление базы данных при нажатии на кнопку. JavaBean, вызывающий событие, называется источником, в объект, получающий вызов, называется подписчиком. JavaBean имеет специальный интерфейс для уведомления подписчиков о событиях, а также методы для добавления и удаления подписчиков.

Обычно, для каждого метода XXX в JavaBean существует интерфейс события XXXListener и два метода. XXXListener должен быть расширением java.util.EventListener. Если это не так и соответствующий BeanInfo не предоставлен, событие не будет обнаружено.

Набор методов интерфейса XXXListener зависит от смысла события, но их сигнатура должна быть в форме void <действие>(<тип событийного объекта> evt);. Важно то, что XXXListener расширяет java.util.EventObject. Если это не так и соответствующий BeanInfo не предоставлен, событие не будет обнаружено.

В качестве примера рассмотрим java.awt.Component, имеющий несколько событий, связанных с перемещением указателя мыши над ним. Интерфейс события java.awt.event.MouseMotionListener реализует следующие два метода:

Методы для добавления подписчиков:

Существует также другой вид событий. К нему относятся события, генерируемые при изменении значения свойства JavaBean. Например, свойство 'enabled' объекта javax.swing.JButton. Свойства, порождающие событие при изменении их значения, называются связанными. Для таких свойств существует общий интерфейс событияjava.beans.PropertyChangeListener, имеющий один метод void propertyCanged(PropertyChangeEvent evt); Аргумент PropertyChangeEvent имеет три метода, которые может вызвать подписчик:

String getPropertyName() Имя измененного свойства JavaBean
Object getNewValue() Новое значение свойства
Object getOldValue() Предыдущее значение свойства

Для регистрации подписчика изменения свойств JavaBean доступно два метода: void addPropertyChangeListener(PropertyChangeListener listener); void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);

Первый доступен во всех JavaBean со связанными свойствами. Реализация второго необязательна и зависит от решения автора JavaBean. Например, компоненты AWT используют только первый метод, а компоненты Swing - оба.

В механизме событий задействованы три объекта:

  1. JavaBean, порождающий событие (источник)
  2. Класс, получающий уведомление о событии от источника (подписчик)
  3. Класс, обрабатывающий уведомление.

Обычно два последних класса совмещаются, например, класс обработчика может помещаться внутрь класса подписчика. Стили кода, распознаваемые и используемые при генерации кода визуальным редактором, описаны в разделе Генерация кода событий.

Классы-адаптеры

Как правило, в интерфейсе события объявляется несколько методов. Например, в java.awt.FocusListener объявляется два метода: focusGained(java.awt.FocusEvent event) и focusLost(java.awt.FocusEventevent). Компилятор Java требует чтобы класс подписчика реализовывал все методы, объявленные в интерфейсе. Поэтому часто в классе подписчика создается много пустых методов и только некоторые методы содержат код. Ниже приведен пример использования FocusListener для реагирования на получение фокуса объектом JavaBean. Поскольку реакция на потерю фокуса не нужна, метод focusLost не содержит кода.

javaBean.addFocusListener(new java.awt.event.FocusListener() {      
    public void focusGained(java.awt.event.FocusEvent e) {          
        doFocusGainedCode();      
     }          
        public void focusLost(java.awt.event.FocusEvent e) {      
     }  
});

Для того чтобы не создавать большое количество пустых методов, можно использовать классы-адаптеры. Они реализуют интерфейс события пустыми методами. Подписчики могут расширять такие классы переопределяя только необходимые методы (остальные наследуются от класса адаптера).

javaBean.addFocusListener(new java.awt.event.FocusAdapter() {     
     public void focusGained(java.awt.event.FocusEvent e) {          
         doFocusGainedCode();      
         }  
   });
Связанные задачи
Просмотр событий компонента
Добавление событий в компонент
Удаление событий из компонента
Просмотр исходного кода события

(C) Copyright IBM Corporation 1999, 2004. Все права защищены.