Обработка событий
В предыдущих главах мы написали много программ, создающих компоненты интерфейса пользователя, но, собственно говоря, интерфейса, т. е. взаимодействия с пользователем, эти программы не обеспечивают. Можно щелкать по кнопке на экране, она будет "вдавливаться" в плоскость экрана, но больше ничего не будет происходить. Можно ввести текст в поле ввода, но он не станет восприниматься и обрабатываться программой. Все это происходит из-за того, что мы не задали обработку действий пользователя, т. е. обработку событий.
Объект, в котором произошло событие, называется
Все события в AWT классифицированы. При возникновении события исполняющая система Java автоматически создает объект соответствующего событию класса. Этот объект не производит никаких действий, он только хранит все сведения о событии.
Во главе иерархии классов-событий стоит класс Eventobject из пакета java.utii — непосредственное расширение класса object. Его расширяет абстрактный класс AWTEvent из пакета java.awt — глава классов, описывающих события библиотеки AWT. Дальнейшая иерархия классов-событий AWT показана на рис. 15.1. Все классы, отображенные на рисунке, кроме класса AWTEvent, собраны в пакет java.awt. event.
□ События типа ComponentEvent, FocusEvent, KeyEvent, MouseEvent возникают во всех компонентах.
□ События типа ContainerEvent- в контейнерах класса Container, а значит, и во всех
компонентах графической библиотеки Swing.
□ События типа WindowEvent возникают в окнах класса Window и в его наследниках.
□ События типа TextEvent генерируются только в компонентах TextComponent, TextArea, TextField.
□ События типа ActionEvent проявляются в компонентах Button, List, TextField, JComboBox, JTextField, кнопках класса AbstractButton и его наследниках.
□ События типа ItemEvent возникают в компонентах Checkbox, JCheckbox, Choice, JComboBox, List и в кнопках класса AbstractButton и его наследниках.
□ Наконец, события типа AdjustmentEvent возникают только в полосах прокрутки
Scrollbar и JScrollBar.
Узнать, в каком объекте произошло событие, можно методом getSource() класса EventObj ect. Этот метод возвращает ссылку на объект типа Obj ect.
В каждом из этих классов-событий определен метод paramString(), возвращающий содержимое объекта данного класса в виде строки String. Кроме того, в каждом классе есть свои методы, предоставляющие те или иные сведения о событии. В частности, метод getID() возвращает
Графическая библиотека Swing добавляет еще несколько классов-событий, собранных в пакет javax.swing.event. Большинство этих классов наследуют напрямую от класса
EventObj ect.
Событие нельзя обработать произвольно написанным методом. У каждого события есть свои методы, к которым обращается исполняемая система Java при его возникновении. Они описаны в интерфейсах-слушателях (listener). Для каждого показанного на рис. 15.1 типа событий, кроме InputEvent (оно редко используется самостоятельно), есть свой интерфейс. Имена интерфейсов составляются из имени события и слова "Listener", например: ActionListener, MouseListener. Методы интерфейса "слушают", что происходит в потенциальном источнике события. При возникновении события эти методы автоматически выполняются, получая в качестве аргумента объект-событие и используя при обработке сведения о событии, содержащиеся в этом объекте.
AWTEvent
—ActionEvent —AdjustmentEvent
- ContainerEvent
- FocusEvent
- InputEvent-
- PaintEvent — WindowEvent
KeyEvent
MouseEvent
— ComponentEvent -
— ItemEvent —TextEvent
Рис. 15.1. Иерархия классов, описывающих события AWT
Чтобы задать обработку события определенного типа, надо реализовать соответствующий интерфейс. Классы, реализующие такой интерфейс, классы
Чтобы связаться с обработчиком события, классы-источники события должны получить ссылку на экземпляр eventHandler класса-обработчика события одним из методов
addXxxListener(XxxEvent eventHandler), где Xxx — имя события.
Такой способ регистрации, при котором слушатель оставляет "визитную карточку" источнику для своего вызова при наступлении события, называется