TextMove tml = new TextMove(tf, ta); tf.addActionListener(tml); b.addActionListener(tml);
Но в первом случае экземпляры создаются после наступления события в соответствующем компоненте, а во втором — независимо от того, наступило событие или нет, что приводит к расходу памяти, даже если событие не произошло. Решайте сами, что лучше.
Рис. 15.2. Обработка события ActionEvent |
Самообработка событий
Класс, содержащий источники события, может сам обрабатывать его. Возвращаясь к примеру с установкой охранной сигнализации, можно сказать, что вы способны самостоятельно прослушивать компоненты в своей квартире, установив пульт сигнализации у кровати. Для этого достаточно реализовать соответствующий интерфейс прямо в классе-контейнере, как показано в листинге 15.2.
import java.awt.*; import java.awt.event.*; import javax.swing.*;
class MyNotebook extends JFrame implements ActionListener{ private JTextField tf; private JTextArea ta;
MyNotebook(String title){ super(title);
tf = new JTextField("Вводите текст", 50); add(tf, BorderLayout.NORTH);
ta = new JTextArea(); ta.setEditable(false); add(ta);
JPanel p = new JPanel(); add(p, BorderLayout.SOUTH);
JButton b = new JButton("Перенести"); 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){
JFrame f = new MyNotebook(" Обработка ActionEvent"); f.setDefaultCloseOperation(EXIT ON CLOSE);
}
}
Здесь поля tf и ta уже не локальные переменные, а переменные экземпляра, поскольку они используются и в конструкторе, и в методе actionPerformed (). Этот метод теперь — один из методов класса MyNotebook. Класс MyNotebook стал классом-обработчиком события ActionEvent — он реализует интерфейс ActionListener. В методе addActionListener() указывается аргумент this — класс сам слушает свои компоненты.
Рассмотренная схема, кажется, проще и удобнее, но она предоставляет меньше возможностей. Если вы захотите изменить обработку, например заносить записи в поле ta по алфавиту или по времени выполнения заданий, то придется переписать и перекомпилировать класс MyNotebook.
Обработка вложенным классом
Еще один вариант — сделать обработчик вложенным классом. Это позволяет обойтись без переменных экземпляра и конструктора в классе-обработчике TextMove, как показано в листинге 15.3.
import java.awt.*; import java.awt.event.*; import javax.swing.*;
class MyNotebook extends JFrame{ private JTextField tf; private JTextArea ta;
MyNotebook(String title){ super(title);
tf = new JTextField("Вводите текст", 50);
add(tf, BorderLayout.NORTH); ta = new JTextArea(); ta.setEditable(false); add(ta);
JPanel p = new JPanel(); add(p, BorderLayout.SOUTH);
JButton b = new JButton("Перенести"); p.add(b);
tf.addActionListener(new TextMove()); b.addActionListener(new TextMove());
setSize(300, 200); setVisible(true);
}
public static void main(String[] args){
JFrame f = new MyNotebook(" Обработка ActionEvent"); f.setDefaultCloseOperation(EXIT ON CLOSE);
}
// Вложенный класс
class TextMove implements ActionListener{
public void actionPerformed(ActionEvent ae){ ta.append(tf.getText()+"\n");
}
}
}
Наконец, можно создать безымянный вложенный класс, что мы и делали в этой и предыдущих главах, обрабатывая нажатие комбинации клавиш
Перейдем к детальному рассмотрению разных типов событий.
1. Реализуйте обработку события безымянным вложенным классом.
Событие
Это простое событие означает, что надо выполнить какое-то действие. При этом неважно, что вызвало событие: щелчок мыши, нажатие клавиши или что-то другое.
В классе ActionEvent есть два полезных метода:
□ getActionCommand ( ) возвращает в виде строки String надпись на кнопке JButton,
точнее, то, что установлено методом setActionCommand(String s) класса JButton, выбранный пункт меню или списка JList, или что-то другое, зависящее от компонента;