суббота, 5 февраля 2011 г.

Java головного мозга. The PropertyChangeListener

Разбираясь с взаимодействием объектов в Netbeans Platform я наткнулся на довольно интересный интерфейс PropertyChangeListener. Ничего сверхнового в нем нет - просто интерфейс обработки событийной модели, но, на мой взгляд, сделанный очень качественно.

Как взаимодействуют объекты

На блок-схеме вкратце изображен принцип работы механизма обработки событий.
Центральную роль в процессе генерации событий занимает класс PropertyChangeSupport. Он позволяет генерировать поток событий при помощи функции firePropertyChange(). В качестве параметров к ней может передаваться либо готовый объект событий класса PropertyChangeEvent, либо три параметра: название события, старое значение, новое значение.
Куда же отправляются генерируемые события? Они отправляются подписчикам. Подписка осуществляется при помощи функции addPropertyChangeListener(), которая принимает в качестве параметров указатель на объект реализации интерфейса PropertyChangeListener. В процессе подписки мы можем либо получать все события интересующего нас объекта, либо выбрать конкретное событие, добавляя подписку на каждое из них по очереди.

Как реализовать взаимодействие

Хорошо, теперь мы знаем как взаимодействуют объекты обработчиков событий между собой, но как применить их к уже существующим объектам? Очень просто! Существуют два основных подхода:


  • Реализация интерфейса PropertyChangeListener в объекте-слушателе:
public class MyBean implements PropertyChangeListener{...}
  • Создание вложенного класса с реализацией PropertyChangeListener в объекте-слушателе
editor.addPropertyChangeListener("grid", new PropertyChangeListener() {
   public void propertyChange(PropertyChangeEvent propertyChangeEvent) {...}
});

В свою очередь, объект, который будет выполнять генерацию событий должен включать в себя объект класса PropertyChangeSupport. Наследование, в данном случае, будет плохой идеей. Помимо этого у объекта генератора событий необходимо создать proxy-функцию для передачи ссылки на объект-слушатель объекту класса PropertyChangeSupport.
Стоит заметить, что у большинства классов библиотеки Swing уже реализован функционал добавления “слушателей” (собственно, а как иначе бы велась обработка событий?).
Для лучшего понимания событийной модели я подготовил неплохой пример, скачать который можно здесь.

1 комментарий:

fotofaust комментирует...

спасибо за статью

Отправить комментарий