Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.17 Mб
Скачать

10.5. Ещё раз о событиях и уведомлении в языке Java

Пополнив наши знания о событиях, генерируемых при применении

мыши, остановимся на них подробнее, вспомнив о событиях, возникающих в

наблюдаемых объектах и воспринимаемых обозревателями, Рассмотрим ещё

раз делегирование, которое было впервые предложено в языке Java и форми-

рует механизм обработки событий,

Итак, объект-источник генерирует событие, на которое реагирует объ-

ект-приёмник события. Естественно, что на событие от одного источника мо-

гут реагировать один или несколько приёмников. Очевидно, из этих сообра-

жений авторы делегирования для класса источника установили наследование

класса (extends), а для классов приёмников - наследование интерфейса (implements).

Таким образом, приёмники могут реагировать на события разных ис-

точников, каждый из которых представлен своим интерфейсом. Что касается

источников, то каждому из них надлежит наследовать только один класс со-

бытия (это требования наследования классов в языке Java и в управляемом

коде), что ограничивает источник генерированием только одного типа собы-

тий. Но самое неприятное здесь то, что, наследовав класс события, источник

уже не может наследовать другой базовый класс, так, возможно, желатель-

ный для расширения его функциональности.

Ключевое слово extends, существенно ограничив расширение функ-

циональности источника из-за исключения наследования иных необходимых

классов, приводит к необходимости применения специальных разноликих

объектов с надлежащей функциональностью. Располагая объектом, класс ко-

торого уже наследует какой-либо класс и не наследует класс события и в ко-

тором требуется генерировать события, достаточно в этом объекте приме-

нить один или несколько специальных объектов. Каждый же из этих специ-

альных объектов будет генерировать только событие определённого типа,

класс которого он для этого и наследует.

Теперь вспомним раздел, посвящённый наблюдаемым объектам и обо-

зревателям. Обозреватель с помощью предопределённой функции update()

реагирует на события (уведомления) от наблюдаемых объектов, генериро-

ванных (уведомляющих) при выполнении предопределённых функций set-

Changed() и notifyObservers(). Предварительно надлежит, применив функцию

addObserver(), подписать обозреватель на событие каждого наблюдаемого

объекта, т а к , наблюдаемый объект выступает как источник события, а обо-

зреватель - как приёмник. И, как это требовалось, наблюдаемый объект-

источник наследует класс Observable, а обозреватель-приёмник - интерфейс

Observer. Как и следовало ожидать, применяется тот же механизм делегиро-

вания.

Заметим, что уведомление предоставляет возможность использовать

любые наблюдаемые объекты и обозреватели, в отличие от делегирования

событий конкретных классов, наследующих суперкласс EventObject. Уве-

домление удобно применять в многопоточных приложениях.

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

ля в языке Java

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

программой интерфейсными элементами, каждый из которьгх способен гене-

рировать событие. К таким элементам относится уже используемая нами

мышь, но также кнопки, флажки, списки с выбором, пункты меню, полосы

прокрутки, клавиши клавиатуры, текстовые редакторы и прикладное окно,

генерирующее события при изменении его размера, при его закрытии и др.

Эти элементы представляются в программе в виде объектов соответст-

вующих классов, в которые встроен механизм делегирования, предполагаю-

щий применение определённых интерфейсов и предопределённых функций.

Причём, ради простоты, не требуется наследовать класс события, соответст-

вующего элементу, поскольку он запретил бы наследовать более значимый

класс, определяющий основное функционирование объекта. Но обязательно

надо наследовать некоторый интерфейс, предписанный для данного элемен-

та.

naKerjava.awt.event содержит следующие классы собьгтий интерфейс-

ных объектов, которые определяют множество констант, свойств и функций,

используемых с соответствующими элементами: ActionEvent, AdjustimentEvent,

ComponentEvent, FocusEvent, InputEvent, ItemEvent, KeyEvent,

MouseEvent, TextEvent и WindowEvent.

Приёмники событий (которые также называют блоками прослушива-

ния) должны наследовать интерфейсы соответствующих интерфейсных объ-

ектов. Определены следующие интерфейсы прослушивания событий: ActionListener,

AdjustmentListener, ComponentListener, ContainerListener, FocusListener,