Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Part6(9-прилож)+++а.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.82 Mб
Скачать
    1. Ещё раз о событиях и уведомлении в языке Java

Пополнив наши знания о событиях, генерируемых при применении мыши, остановимся на них подробнее, вспомнив о событиях, возникающих в наблюдаемых объектах и воспринимаемых обозревателями. Рассмотрим ещё раз делегирование, которое было впервые предложено в языке Java и формирует механизм обработки событий.

Итак, объект-источник генерирует событие, на которое реагирует объект-приёмник события. Естественно, что на событие от одного источника могут реагировать один или несколько приёмников. Очевидно, из этих соображений авторы делегирования для класса источника установили наследование класса (extends), а для классов приёмников – наследование интерфейса (implements).

Таким образом, приёмники могут реагировать на события разных источников, каждый из которых представлен своим интерфейсом. Что касается источников, то каждому из них надлежит наследовать только один класс события (это требования наследования классов в языке Java и в управляемом коде), что ограничивает источник генерированием только одного типа событий. Но самое неприятное здесь то, что, наследовав класс события, источник уже не может наследовать другой базовый класс, так, возможно, желательный для расширения его функциональности.

Ключевое слово extends, существенно ограничив расширение функциональности источника из-за исключения наследования иных необходимых классов, приводит к необходимости применения специальных разноликих объектов с надлежащей функциональностью. Располагая объектом, класс которого уже наследует какой-либо класс и не наследует класс события и в котором требуется генерировать события, достаточно в этом объекте применить один или несколько специальных объектов. Каждый же из этих специальных объектов будет генерировать только событие определённого типа, класс которого он для этого и наследует.

Теперь вспомним раздел, посвящённый наблюдаемым объектам и обозревателям. Обозреватель с помощью предопределённой функции update() реагирует на события (уведомления) от наблюдаемых объектов, генерированных (уведомляющих) при выполнении предопределённых функций setChanged() и notifyObservers(). Предварительно надлежит, применив функцию addObserver(), подписать обозреватель на событие каждого наблюдаемого объекта. Итак, наблюдаемый объект выступает как источник события, а обозреватель – как приёмник. И, как это требовалось, наблюдаемый объект-источник наследует класс Observable, а обозреватель-приёмник – интерфейс Observer. Как и следовало ожидать, применяется тот же механизм делегирования.

Заметим, что уведомление предоставляет возможность использовать любые наблюдаемые объекты и обозреватели, в отличие от делегирования событий конкретных классов, наследующих суперкласс EventObject. Уведомление удобно применять в многопоточных приложениях.

9.5.1. Обработка событий элементов интерфейса пользователя в языке Java

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

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

Пакет java.awt.event содержит следующие классы событий интерфейсных объектов, которые определяют множество констант, свойств и функций, используемых с соответствующими элементами: ActionEvent, AdjustimentEvent, ComponentEvent, FocusEvent, InputEvent, ItemEvent, KeyEvent, MouseEvent, TextEvent и WindowEvent.

Приёмники событий (которые также называют блоками прослушивания) должны наследовать интерфейсы соответствующих интерфейсных объектов. Определены следующие интерфейсы прослушивания событий: ActionListener, AdjustmentListener, ComponentListener, ContainerListener, FocusListener, ItemListener, KeyListener, MouseListener, MouseMotionListener, TextListener и WindowListener. Эти интерфейсы включают предопределённые обработчики событий. Например, интерфейс ActionListener включает предопределённый обработчик actionPerformed(), а интерфейс WindowListener включает предопределённые обработчики windowClosed(), windowClosing(), windowOpened() и др.

Так же как при уведомлении обозреватели подписывают на наблюдаемый объект с помощью функции addObserver(), так и в случае интерфейсных элементов приёмники (блоки прослушивания) подписывают на источник с помощью специальной функции класса источника, которая имеет вид:

public void аddTypeListener (TypeListener tL);

где Type- тип источника события.

При наступлении события источника выполняется предопределённый обработчик подписавшегося приёмника.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]