![]() |
|
||
|
|
|
AWT клиент для веб-приложения. Часть 3(Николай Зайкин) 3. Клиентская часть (продолжение). После создания окна (экземпляра класса Давайте теперь остановимся на рассмотрении модели событий в Java 2. Начиная с Java 1.1 метод обработки событий существенно изменился. Старый метод (из Java 1.0) все еще поддерживается, но не рекомендуется к использованию. Современный метод обработки событий основан на модели делегирования событий. Вкратце схема такова: источник генерирует событие, и посылает его одному или нескольким блокам прослушивания. Блок прослушивания конкретного вида событий должен быть предварительно зарегистрирован в источнике события. В этом и есть отличие от модели Java 1.0, в которой событие распространялось по ограниченной иерархии компонентов, независимо от того, "хотят" ли они принимать это событие или нет, и даже не рассматривая, способен ли компонент вообще обрабатывать данное событие. Распространение события среди всех компонентов приводило к усложнению кода и увеличивало временные затраты. Однако, Java 2. Продолжим. Получив событие, блок прослушивания обрабатывает его и передает упавление назад. Событие - это специальный объект (как и все в Java :), описывающий изменение состояния источника, его породившего. Событие может генерироваться как пользователем (через элменты управления), так и таймером, счетчиком и пр. В данной программе используются только события от элементов управления (кнопки интерфейсы, меню окна, клавиатура) пользователя.
Источник события, как уже упоминалось, должен зарегистрировать блок прослушивания, чтобы последний мог получать события. Общая форма данной процедуры такова:
Для более подробного описания процедуры отправляю к документации, потому как блок можно и
удалять из прослушивания, а также есть источники, позволяющие только один блок
прослушивания.
Теперь коснемся блока прослушивания (в народе, listener). Это объект, который обрабатывает какое-либо событие. Основное требование к нему - он должен реализовывать соответствующие интерфейсы (и соответственно, иметь в своем составе соответствующие методы), позволяющие принимать и обрабатывать события. Рассмотрим все вышесказанное на примере нашего приложения, часть, отвечающая за обработку событий от меню. Создаем меню. Объектами, генерирующими события, будут
Создаем блок прослушивания - объект класса, реализующего интерфейс
И, наконец, регистрируем блок прослушивания для всех пунктов меню.
Просто, не правда ли !? Осталось посмотреть, что же из себя представляет небезызвестный
В переменных класса определяем переменную типа
Собственно, класс имеет всего один метод
Совсем не обязательно создавать отдельный класс для обработчика события. Его можно
реализовать в главном классе приложения ( Не забываем, что блок прослушивания событий должен реализовывать соответствующие
интерфейсы: Регистрируем для источников событий блок прослушивания как указатель на данный объект:
... или ...
И, наконец, реализуем методы, описанные в интерфейсах
Обратите внимание, что всего в приложении мы имеем 2 блока прослушивания событий
Описание методики обработки событий было бы неполным, если бы мы не упомянули о классах-адаптерах... Адаптер (adapter class) - это специальный класс, имеющий пустые реализации всех методов интерфейса прослушивания какой-либо группы событий. Этот класс полезен, когда мы хотим обрабатывать только одно событие из группы, и для того, чтобы не писать реализации методов для других, ненужных нам событий, мы просто наследуем соответствующий класс адаптера при реализации своего блока прослушивания. Это сокращает код программы за счет исключения написания пустых методов. Давайте взглянем на практике, как это выглядит. При нажатии клавиши "Enter"
в текстовом поле слова, запускается процедура перевода. Для того, чтобы отслеживать
нажатие клавиатуры, мы должны зарегистрировать для объекта класса
keyPressed. И для того, чтобы
не писать пустые реализации двух других методов, мы наследуем наш блок прослушивания от
класса-адаптера KeyAdapter, который уже имеет описания этих всех трех
методов, и переопределяем только метод keyPressed.
Вышеуказанный пример использует внутренний класс. Современная методика программирования
на Java часто использует эту технологию. Этот пример можно еще более сократить, используя
анонимный класс (класс, которому не назначено имя).
Итак, мы выяснили, при нажатии клавиши "Enter" запускается процедура перевода слова - основная функция приложения. Что же происходит между клиентом и сервером? Давайте, рассмотрим теперь ту часть программы, которая отвечает за коммуникацию с внешним миром... |
| Справка | Условия | |
| В начало | Логин | Комментарий к колонке | Поиск | Почта |