Обработка события в Java
События
Стратегия обработки событий в Java 1.1 Прослушиватель событий – это класс, который реализует интерфейс java.awt.event.EventListener, обычно через его наследников. Каждый из интерфейсов требует, чтобы его методы были определены в классе, который будет реализовать эти интерфейсы. Например, интерфейс MouseListener : mouseClicked(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) В каждый метод передается параметр – некоторый объект класса с именем Event, создаваемый VJM. Все эти классы наследуют от java.awt.Event.
Модель делегирования событий Событие – это объект, который описывает состояние источника. Событие происходит в любом компоненте. Компонент или контейнер, в котором произошло событие, называется источником события. Все события классифицированы. Корень дерева – класс EventObject из java.util. Класс AWTEvent – наследник класса EventObject. java.awt.event javax.swing.event Имена классов-событий – XxxEvent (ActionEvent, MouseEvent, MouseMotionEvent…) При возникновении события исполняющая система Java распознает причину события, создает объект класса, соответствующего этой причине. В этом объекте содержится вся информация о событии и источнике события. Созданный объект передается методам-обработчикам события. Метод-обработчик создает программист, но сигнатуры методов имеют строгое описание в интерфейсах, называемых слушателями. Имена этих интерфейсов имеют вид – XxxListener ( около 40 ). Разработчик реализует выбранный интерфейс с помощью какого-либо класса (ActionListener – ActionPerformed(ActionEvent e)), а затем подсоединяется к источнику события с помощью метода addXxxListener(). removeXххListener() – отключает объект от прослушивания события
public class EventCreator extends JFrame implements ActionListener { JButton btnBook; JButton btnExit; public EventCreator2() throws Exception { try { setBounds(150,200,500,250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); BorderLayout border = new BorderLayout(); Container content = getContentPane(); content.setLayout(border); btnBook = new JButton("Book"); btnExit = new JButton("Exit"); btnBook.addActionListener(this); btnExit.addActionListener(this); JPanel bottomPanel = new JPanel(); bottomPanel.add(btnBook); bottomPanel.add(btnExit); content.add(bottomPanel, BorderLayout.SOUTH); setVisible(true); }catch(Exception e) { System.out.println("Exception thrown " + e); } } public void actionPerformed(java.awt.event.ActionEvent ae) { if (ae.getActionCommand().equals("Exit")) { System.out.println("Exit was clicked"); } if (ae.getActionCommand().equals("Book")) { System.out.println("Book was clicked"); } } public static void main(String args[]) { try { EventCreator mainWindow = new EventCreator(); }catch(Exception e) { System.out.println("Exception in main " + e); } }
Большинство интерфейсов описывают несколько методов Чтобы не реализовывать все, используют классы- адаптеры, например, MouseAdapter, WindowAdapter Адаптер – абстрактный класс, содержащий пустые реализации методов. От такого класса можно наследоваться и переопределить только те методы, которые нужны для приложения. Адаптеры
слушателя: Интерфейс слушателя w/ adapter Методы интерфейса ActionListener actionPerformed(ActionEvent) AdjustmentListener adjustmentValueChanged(AdjustmentEvent) ComponentListener ComponentAdapter componentHidden(ComponentEvent) componentShown(ComponentEvent) componentMoved(ComponentEvent) componentResized(ComponentEvent) ContainerListener ContainerAdapter componentAdded(ContainerEvent) componentRemoved(ContainerEvent) FocusListener FocusAdapter focusGained(FocusEvent) focusLost(FocusEvent) KeyListener KeyAdapter keyPressed(KeyEvent) keyReleased(KeyEvent) keyTyped(KeyEvent) MouseListener MouseAdapter mouseClicked(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mousePressed(MouseEvent) mouseReleased(MouseEvent) MouseMotionListener MouseMotionAdapter mouseDragged(MouseEvent) mouseMoved(MouseEvent) WindowListener WindowAdapter windowOpened(WindowEvent) windowClosing(WindowEvent) windowClosed(WindowEvent) windowActivated(WindowEvent) windowDeactivated(WindowEvent) ItemListener itemStateChanged(ItemEvent) TextListener textValueChanged(TextEvent) Это не полный список, частично потому, что событийная модель позволяет вам создавать вам свои собственные
Событие, интерфейс слушателя и методы добавления, удаления Компоненты, поддерживающие это событие ActionEvent ActionListener addActionListener( ) removeActionListener( ) JButton, JList, JTextField, JMenuItem и наследованные от них, включая JCheckBoxMenuItem, JMenu и JPopupMenu. AdjustmentEvent AdjustmentListener addAdjustmentListener( ) removeAdjustmentListener( ) JScrollbar и все, что вы создаете, реализуя Adjustable interface. ContainerEvent ContainerListener addContainerListener( ) removeContainerListener( ) ( добавление или удаление компонента) Container и наследованные от него, включая JPanel, JApplet, JScrollPane, Window, JDialog, JFileDialog и JFrame. ComponentEvent ComponentListener addComponentListener( ) removeComponentListener( ) (изменение размеров компонента, положения, перекрытия другим компонентом) Component и наследованные от него, включая JButton, JCanvas, JCheckBox, JComboBox, Container, JPanel, JApplet, JScrollPane, Window, JDialog, JFileDialog, JFrame, JLabel, JList, JScrollbar, JTextArea и JTextField. Все компоненты Swing включают методы addXXXListener( ) и removeXXXListener( ), так что подходящий тип слушателя может быть добавлен и удален для каждого компонента. Вы заметите, что XXX в каждом случае также представляет аргумент метода, например: addMyListener(MyListener m).
Событие, интерфейс слушателя и методы добавления, удаления Компоненты, поддерживающие это событие MouseEvent (для кликов и перемещений) MouseListener addMouseListener( ) removeMouseListener( ) Component и унаследованные. FocusEvent FocusListener addFocusListener( ) removeFocusListener( ) (передача фокуса) Component и унаследованные. WindowEvent WindowListener addWindowListener( ) removeWindowListener( ) Window и унаследованные от него, включая JDialog, JFileDialog и JFrame. ItemEvent ItemListener addItemListener( ) removeItemListener( ) JCheckBox, JCheckBoxMenuItem, JComboBox, JList и все, что реализует ItemSelectable interface. TextEvent TextListener addTextListener( ) removeTextListener( ) Все, что унаследовано от JTextComponent, включая JTextArea и JTextField. KeyEvent KeyListener addKeyListener( ) removeKeyListener( ) Component и унаследованные.
Event.java Event4.java анонимный класс на основе listener Event3.java анонимный класс на основе адаптера Event2.java на основе класса, наследующего от адаптера Event1.java с классом, реализующим интерфейс
Event1.java и Event2.java Обработка события с использованием реализации интерфейса public class MyApplet extends Applet implements MouseListener { … public void init() { addMouseListener(this); } public void mouseEntered(MouseEvent event) { } public void mouseExited(MouseEvent event) { } public void mousePressed(MouseEvent event) { } public void mouseReleased(MouseEvent event) { } public void mouseClicked(MouseEvent event) { } } Обработкa события с использованием вложенного класса, наследника класса- адаптера public class MyApplet extends Applet { … public void init() { this.addMouseListener(new MyMouseAdapter()); … } class MyMouseAdapter extends MouseAdapter{ public void mousePressed(MouseEvent e) { last_x = e.getX(); last_y = e.getY(); }
Event3.java и Event4.java Обработка события с использованием анонимного класса на основе адаптера public class MyApplet extends Applet { … public void init() { this.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { last_x = e.getX(); last_y = e.getY(); } }); … } Обработка события с использованием анонимного класса public class MyApplet extends JApplet { … public void init() { MouseListener ml = new MouseAdapter(){ public void mousePressed(MouseEvent e) { xPrev = e.getX(); yPrev = e.getY(); } … addMouseListener(ml); }
Создание собственного события class MyEvent extends java.util.EventObject { // класс событие protected int id; public static final int START = 0, STOP = 1; public MyEvent(Object source, int id) { super (source); this.id=id; } public int getID() { return id; } } //описание интерфейса слушателя interface MyListener extends java.util.EventListener { public void start_act (MyEvent e); public void stop_act (MyEvent e); } public class Test extends JApplet implements ActionListener, MyListener { JButton button; public void init() { button = new JButton("Click Me"); getContentPane().add(button, BorderLayout.CENTER); button.addActionListener(this); //регистрация слушателя } public void start() { fireEvent(new MyEvent(this,MyEvent.START) ); } public void stop() { fireEvent(new MyEvent(this,MyEvent.STOP) ); } public void actionPerformed(ActionEvent e) { Toolkit.getDefaultToolkit().beep(); } public void start_act (MyEvent e) { System.out.println("Hello "+ e.getID()); } public void stop_act (MyEvent e) { System.out.println("By " "+ e.getID()); ); } public void fireEvent (MyEvent e ) { MyListener lst = this; switch(e.getID()) { case MyEvent.START: lst.start_act (e); break; case MyEvent.STOP: lst.stop_act (e); break; }