Обработка событий
Листинг 12.2. Самообработка события ActionEvent.
import java.awt.*; import java.awt.event.*; class MyNotebook extends Frame implements ActionListener{ private TextField tf; private TextArea ta; MyNotebook(String title){ super(title); tf = new TextField ("Вводите текст**", 50); add(tf, BorderLayout.NORTH); ta = new TextArea(); ta.setEditable(false); add(ta); Panel p = new Panel(); add(p, BorderLayout.SOUTH); Button b = new Button("Перенести"); p.add(b); tf.addActionListener(this); b.addActionListener(this); setSize(300, 200); setVisible(true); } public void actionPerformed(ActionEvent ae){ ta.append(tf.getText()+"\n"); } public static void main(String[] args){ Frame f = new MyNotebook(" Обработка ActionEvent"); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ev){ System.exit(0); } }); } }
Здесь tf и ta уже не локальные переменные, а переменные экземпляра, поскольку они используются и в конструкторе, и в методе actionPerformed (). Этот метод теперь – один из методов класса MyNotebook. Класс MyNotebook стал классом-обработчиком события ActionEvent – он реализует интерфейс ActionListener. В Методе addActionListener () указывается аргумент this – класс сам слушает свои компоненты.
Рассмотренная схема, кажется, проще и удобнее, но она предоставляет меньше возможностей. Если вы захотите изменить обработку, например заносить записи в поле ta по алфавиту или по времени выполнения заданий, то придется переписать и перекомпилировать класс MyNotebook.
Еще один вариант – сделать обработчик вложенным классом. Это позволяет обойтись без переменных экземпляра и конструктора в классе-обработчике TextMove, как показано в листинге 12.3.
Листинг 12.3. Обработка вложенным классом.
import Java.awt.*; import j ava.awt.event.*; class MyNotebook extends Frame{ private TextField tf; private TextArea ta; MyNotebook(String title){ super(title); tf = new TextField("Вводите текст", 50); add(tf, BorderLayout.NORTH); ta = new TextArea(); ta.setEditable(false); add (tab-Panel p = new Panel(); add(p, BorderLayout.SOUTH); Button b = new Button("Перенести"); p.add(b); tf.addActionListener(new TextMove()); b.addActionListener(new TextMove()); setSizepOO, 200); setVisible(true); } public static void main(String[] args){ Frame f = new MyNotebook(" Обработка ActionEvent"); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ev){ System.exit (0); } }); } // Вложенный класс class TextMove implements ActionListener{ public void actionPerformed(ActionEvent ae){ ta.appendftf.getText()+"\n"); } } }
Наконец, можно создать безымянный вложенный класс, что мы и делали в этой и предыдущих главах, обрабатывая нажатие комбинации клавиш ALT + F4 или щелчок кнопкой мыши по кнопке закрытия окна. При этом возникает событие типа windowEvent, для его обработки мы обращались к методу windowciosing(), реализуя его обращением к методу завершения приложения System.exit (0). Но для этого нужно иметь суперкласс определяемого безымянного класса, такой как windowAdapter. Такими суперклассами могут быть классы-адаптеры, о них речь пойдет чуть ниже.
Перейдем к детальному рассмотрению разных типов событий.