Используется модель делегирования событий. Участвует 3 участника:
1. event source - источник
2. event object – событие
3. event listener - слушатель
Источник генерирует событие и направляет его слушателям. Слушатель ожидает событие и его обрабатывает.
Событие – объект. Суперкласс- java.util.EventOblect. Полезный метод- object.getSource(). Информирует об источнике события.
Для событий AWT(Swing): cобытия -объекты класса java.awt.AWTEvent.
В объекте события хранится:
- ссылка на объект-источник события;
- дополнительная информация (например, координаты мышки).
Источник – объект, который генерирует событие. Он отправляет его всем зарегистрированным слушателям.
Регистрация производится методом: addХxxListener (XxxListener el)
Xxx – тип события.
public void addActionListener () - для JButton
addKeyListener () – для клавиатуры
addMouseMotionListener () – для перемещения мыши
public void removeXxxListener(XxxListener el) – для отмены регистрации
Эти методы предоставляются источниками событий (т.е. источнтки должны иметь эти методы)
Слушатель событий:
1) должен быть зарегистрирован в объекте – источнике события.
|
|
2) должен реализовывать метод для обработки событий (обработчик). Т.е. реализовывать нужный интерфейс.
………implements ActionListener() {….
public actionPerformed (ActionEven ev){…..} ……….//Обработчик события
}
Все методы обработки вызываются из одного потока обработки событий (Т.е. по очереди). Поэтому, метод-обработчик. должен работать быстро, иначе не будет реакции на другие события. Для длительной операции нужно создавать отдельный поток.
Такая организация программ называется CallBack (обратный вызов). Реализован принцип Голливуда-«Не звоните нам, мы Вам сами перезвоним».(Регистрация обработчика-оставили № телефона.Он записался в объекте-источнике события. Произошло событие-объект-источник делает звонок по этому №).
Регистрация обработчиков.
Контейнер – обработчик события (самообработка событий),обработка классом-контейнером
import java.awt.*;
import java.awt.event.*;
import java.swing.*;
class MyNotebook extends JFrame implements ActionListener {
private JTextField tf;//одна строка
private JTextArea ta;// текстовое поле
public MyNotebook (String title) {//конструктор
super (title);
Container c = getContentPane ();
tf = new JTextField (“Введите текст “, 50);
c.add (tf, BorderLayout.NORTH);
ta = new JText Area ();
ta.setEditable (false);
c.add (ta);
JPanel p = new JPanel ();
JButton b = new JButton (“Перенести”);
JButton bс = new JButton (“Очистить”);
p.add (b);
p.add (bс);
c.add (p, Borderlayout.SOUTH);
b.add ActionListener (this);//регистрация
bс.add ActionListener (this);
tf.add ActionListener (this);
setSize (300,200);
setVisible (true);
}
public void actionPerformed (ActionEvent al) {//обработчик событий
if(ae.getSource == bc)
ta.setText(“”);
else
ta.append (tf.getText() + “\n”);
//System.out.println (ae.getSource);//для отладки
}
public static void main (String [] args) {
JFrame f = new MyNotebook (“Обработка событий”);
f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
}
}
Обработка события