Java и обработка событий

  1. Быть управляемым событиями
  2. Класс Event
  3. Типы событий
  4. Отправка и распространение событий
  5. Методы вспомогательных событий

Большинство программ, чтобы быть полезными, должны отвечать на команды пользователя. Для этого Java-программы используют события, описывающие действия пользователя.

В прошлом месяце я продемонстрировал, как собрать графический интерфейс пользователя из компонентов, предоставляемых абстрактным оконным инструментарием библиотеки классов Java. После сборки нескольких таких интерфейсов я кратко рассказал о теме обработки событий, но я остановился на полном описании обработки событий, реализованном AWT. В этом месяце мы подберем то, на чем остановились.

Быть управляемым событиями

В далеком прошлом, программа, которая хотела знать, что делает пользователь, должна была активно собирать такую ​​информацию сама. На практике это означало, что после инициализации программы она входила в большой цикл, в котором она неоднократно проверяла, делает ли пользователь что-нибудь интересное (например, нажатие кнопки, касание клавиши, перемещение ползунка, перемещение мыши) а затем предпринял соответствующие действия. Этот метод известен как опрос .

Опрос выполняет свою работу, но имеет тенденцию быть громоздким при использовании в современных приложениях по двум связанным причинам: во-первых, использование опроса приводит к тому, что весь код обработки событий помещается в одно место (внутри большого цикла); во-вторых, получающиеся взаимодействия в большой петле имеют тенденцию быть сложными. Кроме того, опрос требует, чтобы программа сидела в цикле, потребляя циклы ЦП, ожидая, когда пользователь что-то сделает - серьезная трата ценного ресурса.

AWT решил эти проблемы, приняв другую парадигму, лежащую в основе всех современных оконных систем: программирование на основе событий. В AWT все пользовательские действия принадлежат абстрактному набору вещей, называемых событиями . Событие описывает достаточно подробно конкретное действие пользователя. Вместо того, чтобы программа активно собирала сгенерированные пользователем события, среда выполнения Java уведомляет программу, когда происходит интересное событие. Программы, которые обрабатывают взаимодействие с пользователем таким способом, называются управляемыми событиями .

Класс Event

Класс Event является основным игроком в игре событий. Он пытается захватить фундаментальные характеристики всех пользовательских событий. В таблице 1 перечислены открытые элементы данных, предоставляемые классом Event.

Цель объекта Ссылка на компонент, который первоначально получил событие. долго когда Момент времени, когда произошло событие. int id Тип события (см. раздел «Типы событий» для получения дополнительной информации). int x Координата x, в которой произошло действие относительно компонента, который в данный момент обрабатывает событие. Для данного события координата x изменится по мере продвижения события вверх по иерархии компонентов. Начало координатной плоскости находится в верхнем левом углу компонента. int y Координата y, в которой произошло действие относительно компонента, который в данный момент обрабатывает событие. Для данного события координата y будет меняться по мере продвижения события вверх по иерархии компонентов. Начало координатной плоскости находится в верхнем левом углу компонента. Клавиша int Для событий клавиатуры, код клавиши только что нажатой. Его значение обычно будет значением Unicode символа, который представляет ключ. Другие возможности включают значения для специальных клавиш HOME, END, F1, F2 и т. Д. Модификаторы int Арифметически или комбинация значений SHIFT_MASK, CTRL_MASK, META_MASK и ALT_MASK. Его значение представляет состояние клавиш shift, control, meta и alt соответственно. int clickCount Количество последовательных щелчков мыши. Этот элемент данных имеет значение только в событиях MOUSE_DOWN. Object arg Аргумент, зависящий от события. Для объектов Button этот объект является объектом String, который содержит текстурную метку кнопки. Таблица 1: Открытые члены данных, предоставляемые классом Event

Как я объясню в разделе « Отправка и распространение событий» , экземпляр класса Event обычно создается системой времени выполнения Java. Тем не менее, программа может создавать и отправлять события компонентам через их метод postEvent ().

Типы событий

Как упоминалось выше, класс Event является моделью события пользовательского интерфейса. События естественно делятся на категории в зависимости от типа события (тип события указывается элементом данных id). В таблице 2 перечислены все события, определенные AWT, отсортированные по категориям.

Таблица 2: События, определенные AWT, отсортированные по категориям

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

Вам нужен браузер с поддержкой Java для просмотра этого апплета

Рисунок 1: Генерация событий в действии

Отправка и распространение событий

Рассмотрим апплет на рисунке 2. Он состоит из двух экземпляров класса Button, встроенных в экземпляр класса Panel. Этот экземпляр класса Panel сам по себе встроен в другой экземпляр класса Panel. Последний экземпляр класса Panel расположен ниже экземпляра класса TextArea, и оба экземпляра встроены в экземпляр класса Applet. На рисунке 3 представлены элементы, составляющие этот апплет, разложенные в виде дерева, с экземплярами TextArea и Button в качестве листьев, а экземпляр Applet в качестве корня. (Для получения дополнительной информации об иерархической структуре компонентов в пользовательском интерфейсе прочитайте введение за последний месяц в AWT.)

Вам нужен браузер с поддержкой Java для просмотра этого апплета

Рисунок 2: Классы, встроенные в классы

Рисунок 2: Классы, встроенные в классы

Рисунок 3: Дерево элементов апплета (иерархия)

Когда пользователь взаимодействует с апплетом на рисунке 2, система времени исполнения Java создает экземпляр класса Event и заполняет его члены данных информацией, описывающей действие. Затем система времени выполнения Java позволяет апплету обрабатывать событие. Он начинается с компонента, который первоначально получил событие (например, кнопка, по которой была нажата кнопка), и перемещается вверх по дереву компонентов, компонент за компонентом, пока не достигнет контейнера в верхней части дерева. По пути каждый компонент имеет возможность игнорировать событие или реагировать на него одним (или несколькими) из следующих способов:

  • Изменить элементы данных экземпляра Event
  • Принять меры и выполнить некоторые вычисления на основе информации, содержащейся в событии
  • Укажите системе выполнения Java, что событие не должно распространяться дальше по дереву.

Система времени выполнения Java передает информацию о событии компоненту с помощью метода handleEvent () компонента. Все допустимые методы handleEvent () должны иметь форму

public boolean handleEvent (событие e)

Обработчику событий требуется один фрагмент информации: ссылка на экземпляр класса Event, содержащий информацию о только что произошедшем событии.

Значение, возвращаемое методом handleEvent (), важно. Это указывает системе времени выполнения Java, было ли событие полностью обработано в обработчике событий. Истинное значение указывает, что событие было обработано и распространение должно быть остановлено. Ложное значение указывает, что событие было проигнорировано, не может быть обработано или было обработано не полностью и должно продолжаться вверх по дереву.

Рассмотрим следующее описание воображаемого взаимодействия пользователя с апплетом на рисунке 2. Пользователь нажимает кнопку с надписью «One». Система времени исполнения языка Java собирает информацию о событии (количество щелчков, местоположение щелчка, время, когда произошел щелчок, и компонент, который получил щелчок) и упаковывает эту информацию в экземпляр класса Event. Затем система времени исполнения Java начинается с компонента, по которому был выполнен щелчок (в данном случае это кнопка с меткой «One»), и, посредством вызова метода handleEvent () компонента, дает компоненту возможность отреагировать на событие. Если компонент не обрабатывает событие или обрабатывает событие не полностью (на что указывает возвращаемое значение false), система времени выполнения Java предлагает экземпляр Event следующему более высокому компоненту в дереве - в этом случае экземпляр Панельный класс. Система времени выполнения Java продолжает работать таким образом, пока событие не будет обработано или в системе времени выполнения не закончатся компоненты, которые нужно попробовать. На рисунке 4 показан путь этого события, когда апплет пытается его обработать.

На рисунке 4 показан путь этого события, когда апплет пытается его обработать

Рисунок 4: путь к событию

Каждый компонент, составляющий апплет на рисунке 2, добавляет строку к объекту TextArea, которая указывает, что он получил событие. Затем он позволяет событию распространяться на следующий компонент в дереве. В листинге 1 приведен код для типичного метода handleEvent (). Полный исходный код для этого апплета доступен Вот ,


public boolean handleEvent (Event evt) {if (evt.id == Event.ACTION_EVENT) {ta.appendText ("Panel" + str + "saw action ... \ n"); } else if (evt.id == Event.MOUSE_DOWN) {ta.appendText ("Панель" + str + "увидела мышь вниз ... \ n"); }
return super.handleEvent (evt); }

Листинг 1: Типичный метод handleEvent ()

Методы вспомогательных событий

Метод handleEvent () - это одно место, куда программист может поместить код приложения для обработки событий. Однако иногда компонент будет интересоваться только событиями определенного типа (например, событиями мыши). В этих случаях программист может поместить код в вспомогательный метод , а не помещать его в метод handleEvent ().

Вот список вспомогательных методов, доступных программистам. Для определенных типов событий нет вспомогательных методов.

действие (событие evt, объект чего)

gotFocus (событие evt, объект чего)

lostFocus (событие evt, объект чего)

mouseEnter (событие evt, int x, int y)

mouseExit (Событие evt, int x, int y)

mouseMove (событие evt, int x, int y)

mouseUp (событие evt, int x, int y)

mouseDown (событие evt, int x, int y)

mouseDrag (событие evt, int x, int y)

keyDown (событие evt, int key)

keyUp (Event evt, int key)

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

Реализация метода handleEvent (), предоставляемого классом Component, вызывает каждый вспомогательный метод. По этой причине важно, чтобы переопределенные реализации метода handleEvent () в производных классах всегда заканчивались оператором

return super.handleEvent (e);

Код в листинге 2 иллюстрирует это правило.


public boolean handleEvent (Event e) {if (e.target instanceof MyButton) {// сделать что-то ... return true; }
return super.handleEvent (e); }

Листинг 2: Правило для завершения оператора в методе handleEvent ()

Несоблюдение этого простого правила помешает правильному вызову вспомогательных методов.

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

Событие evt Следующее событие в связанном списке событий. События окна События окна генерируются в ответ на изменения состояния окна, фрейма или диалога. Идентификатор события WINDOW_DESTROY 201 WINDOW_EXPOSE 202 WINDOW_ICONIFY 203 WINDOW_DEICONIFY 204 WINDOW_MOVED 205 События клавиатуры События клавиатуры генерируются в ответ на нажатия и отпускание клавиш, когда компонент имеет фокус ввода. Идентификатор события KEY_PRESS 401 KEY_RELEASE 402 KEY_ACTION 403 KEY_ACTION_RELEASE 404 События мыши События мыши создаются в ответ на действия мыши, происходящие в пределах границы компонента. Идентификатор события MOUSE_DOWN 501 MOUSE_UP 502 MOUSE_MOVE 503 MOUSE_ENTER 504 MOUSE_EXIT 505 MOUSE_DRAG 506 События прокрутки События прокрутки генерируются в ответ на манипуляции с полосами прокрутки. Идентификатор события SCROLL_LINE_UP 601 SCROLL_LINE_DOWN 602 SCROLL_PAGE_UP 603 SCROLL_PAGE_DOWN 604 SCROLL_ABSOLUTE 605 Список событий Список событий генерируется в ответ на выбор, сделанный в списке. Идентификатор события LIST_SELECT 701 LIST_DESELECT 702 Разные события Разные события генерируются в ответ на различные действия. Идентификатор события ACTION_EVENT 1001 LOAD_FILE 1002 SAVE_FILE 1003 GOT_FOCUS 1004 LOST_FOCUS 1005 Тодд Сундстед занимается программированием, поскольку компьютеры стали доступны в настольных моделях. Первоначально Тодд был заинтересован в создании приложений распределенных объектов на C ++, но перешел на язык программирования Java, когда Java стала очевидным выбором для такого рода вещей. В дополнение к письму, Тодд предоставляет консалтинговые услуги в Интернете и веб-приложениям компаниям на юго-востоке США.

Узнайте больше об этой теме

Похожие

[Решено] Alt Tab не работает
Если вам нужно переключаться между двумя довольно часто работающими над окнами, вы можете легко добиться этого, нажав клавиши Alt и Tab вместе. Тогда вы будете очень раздражены, когда клавиши Alt и Tab перестанут работать. Не паникуйте. Вы можете легко решить эту проблему с помощью методов здесь. Попробуйте эти методы: Изменить значения реестра AltTabSetting Проверь свою клавиатуру
Лучшие Android VPN для 2019
Что такое VPN? Использование телефона или планшета Android в общедоступной сети Wi-Fi может быть опасным по нескольким причинам. Например, неправильно настроенная сеть может раскрыть ваши данные другим. Существует также вероятность того, что гнусные вечеринки настроили невинную внешнюю беспроводную сеть специально для того, чтобы обмануть вас в подключении. Мошеннические сети может быть очень трудно отличить от реальной вещи, поэтому вы должны использовать
Sony Xperia Z Ultra в тесте: мини-планшет с функцией телефонии
С Xperia Z Ultra Sony представляет смартфон большого размера или слишком горячо вымытый планшетный ПК. 6,4-дюймовый экран не только интересен из-за своего размера, он также реагирует на ввод с помощью карандаша или ручки. Является ли Xperia Z Ultra конкурентом Galaxy Note 3? Тест networld дает ответ. Sony Xperia Z Ultra не только больше, чем другие смартфоны, но и обладает специальной функцией: если у пользователя нет под рукой блока, он может просто использовать карандаши или ручки,
LTE мобильный интернет в Польше. Технологии, лимиты, модемы, сравнение предложений операторов
Представляем веб-отчет Spider о мобильном интернете LTE в Польше. Мы объясняем, что такое технология LTE, советуем выбрать мобильный интернет LTE, обсуждаем доступные на рынке тарифы и оборудование (смартфоны, планшеты, маршрутизаторы, модемы LTE). Мы живем в постоянном движении. В то время, когда технологические достижения обычно сводятся к трем простым словам - быстрее, больше, проще. Мы создали смартфоны, которые позволили нам отделить работу и развлечения
Является ли Xperia Z Ultra конкурентом Galaxy Note 3?