[an error occurred while processing this directive] IT • archiv :: Print

IT • archiv


[an error occurred while processing this directive]

[an error occurred while processing this directive]

События и обработчики

[an error occurred while processing this directive](none) [an error occurred while processing this directive](none)[an error occurred while processing this directive] ::
[an error occurred while processing this directive](none)
[an error occurred while processing this directive]([an error occurred while processing this directive](none)[an error occurred while processing this directive])

[an error occurred while processing this directive](none)
Java Q&A
PDF versionPDF версия

Как можно создать собственное событие?

Как можно создать собственное событие и как его генерировать чтобы компонент мог обработать это событие?

Перед тем как создавать собственное событие, взглянем на уже описанное событие: ActionEvent.

Такие компоненты как Button и JButton генерируют ActionEvent чтобы указать на определеный тип характерного для этой компоненты события. Например, Button перехватывает ActionEvent если пользователь нажал на нее. Основной целью любого события является информирование обработчика о том, что с компонентой в GUI что-то произоизошло.Любое событие включает всю информацию необходимую обработчику для определения что за событие произошло и для кого это событие предназначено (смысл и источник события). Любое событие должно предоставлять достаточно информации для собственного описания. Таким образом, обработчик может точно определить что произошло и осмысленно реагировать.

ActionEvent включает методы для определения командной строки, модификаторов и идентификационной строки события. Метод getActionCommand() возвращает командную строку, которая определяет назначенное событию действие, такое как печать или копирование (смысл). Метод getSource() возвращает объект, который сгенерировал событие (источник).

Для того чтобы получать ActionEvent, обработчик должен наследовать интерфейс ActionListener и зарегестрировать себя в компоненте. Более того, компонента должна отслеживать свои обработчики для извещения их о событии.

Используя в качестве модели пример ActionEvent, мы можем легко рассмотреть части, необходимые компоненту для генерирования события и обработчику для отслеживания события. На высшем уровне имеется три части:

  1. Компонента
  2. Класс события
  3. Интерфейс обработчика

Давайте рассмотрим каждую часть в отдельности.

Компонента

Компоненты генерируют события. Любое событие — это способ компоненты известить обработчик о каком-либо событии. Поэтому, компонента должна обеспечивать механизм для регистрации и удаления обработчиков событий. Еще компонента должна отслеживать свои обработчики и передавать им события.

Реализация механизма регистрации/удаления и отслеживания предоставлена каждой компоненте индивидуально. Тем не менее, компонента будет иметь методы addXXXListener и removeXXXListener для каждого типа события, которое она генерирует. Компонента может хранить внутри себя обработчик любым образом; однако, обычно, компоненты хранят обработчики в объектах типа java.util.Vector или javax.swing.event.EventListenerList. Для передачи события его обработчикам, компонента просто перебирает список обработчиков и передает событие каждому из них, путем вызова метода отправки события для каждого обработчика.

Настал черед для примера:

...
EventListenerList xxxListeners = new EventListnerList();

public void addXXXListener(XXXListener listener)
 {
     xxxListeners.add(XXXListener.class, listener);
}

public void removeXXXListener(XXXListener listener)
 {
     xxxListeners.remove(XXXListener.class, listener);
}

protected void fireXXX(XXXEvent xxxEvent)
 {
     Object[] listeners = xxxListeners.getListenerList();

     // просмотр всех обработчиков и, 
     // при необходимости, передача события
      Int numListeners = listeners.length;
     for (int i = 0; i<NUMLISTENERS;
 i+="2)"      {
          if (listeners[i]==XXXListener.class)
           {
              // передача события методу 
              //отправки обработчика события
              ((XXXListener)listeners[i+1]).
 		dispatchXXX(xxxEvent);
          }
      }
}

Этот пример показывает, как регестрировать, удалять и распространять события типа XXXEvent. Обработчики могут регестрировать и удалять сами себя с помощью методов addXXXListener() и removeXXXListener(). Когда происходит какое-то событие, компонента создает объект события и передает его методу fireXXX(), через который событие передается обработчику.

Этот пример описывает обобщенный способ, которому могут следовать все компоненты. Однако, чтобы пример заработал, вы должны описать XXXEvent и интерфейс XXXListener.

Класс события.

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

Обычно, события наследуют класс события java.awr.AWTEvent.

Интерфейс обработчика.

Интерфейс обработчика описывает методы, используемые компонентой для передачи событий. Каждое событие должно иметь минимум один соответствующий ему метод передачи в интерфейсе обработчика.

Интерфейс обработчика имеет общий формат такого вида:

public interface XXXListener
      extends EventListener
{
     //методы передачи события
      somethingHappened(XXXEvent e);
     somethingElseHappened(XXXEvent e);
     ...
}

Для "ожидания" события обработчик должен наследовать интерфейс XXXListener и зарегестрировать себя в компоненте. Когда происходит какое-либо событие, компонента должна вызвать надлежащий метод передачи. Методы описаны в соответсвующем интерфейсе и таким образом, объект может получать событие. Пока обработчик наследует интерфейс, компонента знает как передавать событие обработчику.

Заключение

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

Компонента обращается напрямую к событию и обработчику. Ей необходимо знать об обоих чтобы создавать события, передавать события и регистрировать обработчики.

В отличии от других двух частей, объект события независим. В результате, многие компоненты свободно генерируют события разных типов. Более того, несколько интерфейсов могут описывать методы передачи события.

Об авторе

Tony Sintes главный консультант в BroadVision. Tony, сертифицированный Sun Java 1.1 программист и Java 2 разработчик, работает с Java начиная с 1997г.

Reprinted with permission from the August 2000 edition of JavaWorld magazine. Copyright © ITworld.com, Inc., an IDG Communications company.
View the original article at: http://www.javaworld.com/javaworld/ javaqa/2000-08/01-qa-0804-events.html

[an error occurred while processing this directive]
[an error occurred while processing this directive] Перевод на русский © Александр Серебряков, 2000
< Вернуться на caйт :: Copyright © 1999 — 2010, IT • archiv.