Интернет-технологии Основы JAVA Модуль : Обработка событий Обработка событий Источник генерирует событие и посылает его слушателю (listener). java.awt.event Источник события: должен регистрировать слушателей event source public void addTypeListener(TypeListener el); Туре - имя события, а еl - ссылка на слушателя события. Обработчик (приемник ) события: во-первых, должен быть зарегистрирован event listener источником событий во-вторых, он должен реализовать методы для получения и обработки таких уведомлений. Классы событий EventObject – суперкласс ActionEvent – генерируется по нажатию кнопки, двойному щелчку на элементе списка либо при выборе пункта меню MouseEvent – генерируется при перетаскивании, перемещении, щелчках, нажатии и отпускании кнопок мыши KeyEvent – генерируется при клавиатурном вводе и др. Обработка событий Обработчик событий - объект, оповещаемый о возникновении события. Требования: • Во-первых, чтобы получать оповещения о конкретном типе событий, он должен быть зарегистрирован в источнике • Во-вторых, он должен реализовывать метод, предназначенный для обработки события Интерфейсы Методы, позволяющие обрабатывать события, определены в интерфейсах. В интерфейсе ActionListener объявлен метод actionPerformed () , вызываемый при возникновении события, когда пользователь щелкает на кнопке или выполняет действие, затрагивающее компонент. ActionEvent – ActionListener MouseEvent – MouseListener, MouseMotionListener KeyEvent – KeyListener Обработка событий действий void actionPerformed(ActionEvent e) - вызывается при возникновении события; где е - конкретное событие. Объект ActionEvent, передаваемый методу actionPerformed () , предоставляет доступ к информации о событии. Идентифицировать компонент, сгeнерировший событие можно двумя способами: • по строке, представляющей команду действия • посредством ссылки на объект String getActionCommand() – возвращает строку команды действия для компонента, сгенерировавшего событие (Например, по щелчку на кнопке генерируется событие действия, для котоpoгo строка команды совпадает с текстом, отображаемым на этой кнопке. ) Object getSource() - определяет компонент, получая ссылку на него. Преимущество использования getSource() состоит в том, что если потребуется выполнять действия непосредственно с компонентом, то можно сделать это с помощью ссылки Object. Пример обработки событий Расположение компонентов JPanel contentPanel = new JPanel(new GridLayout(2, 0)); JPanel textPanel = new JPanel(new FlowLayout()); JPanel buttonPanel = new JPanel(new FlowLayout()); JLabel jlbl = new JLabel(" Events "); textPanel.add(jlbl); //JTextField jtxt; Объявлен выше в class firstSw jtxt = new JTextField("not events", 15); textPanel.add(jtxt); //JButton btnOk, btnQ; Объявлены выше в class firstSw btnOk = new JButton("Go Event"); btnQ = new JButton("Quit"); buttonPanel.add(btnOk); buttonPanel.add(btnQ); contentPanel.add(textPanel); contentPanel.add(buttonPanel); Пример обработки событий import java.awt.event.*; /*……………др. включения import…..*/ public class firstSw implements ActionListener{ JButton btnOk, btnQ; JTextField jtxt; public firstSw() { /* ……Расположение компонентов GridLayout , FlowLayout и др. …………*/ btnOk.addActionListener(this); // источник регистрирует слушателей btnQ.addActionListener(this); // источник регистрирует слушателе //………………………………. } public void actionPerformed(ActionEvent e) { if (e.getSource().equals(btnOk)) { /*Object getSource () - возвращает ссылку на компонент, boolean equals(Object str) - сравнивает символы внутри объекта String. */ jtxt.setText("Event \"OK\""); } if (e.getSource().equals(btnQ)) { jtxt.setText("Event \"Quit\""); } } public static void main(String[] args) {//……………………………} } Пример обработки событий Альтернативные подходы к обработки событий Обработчики посредством неименованных внутренних классов. Например, обработчик для кнопки может иметь следующий вид: public class firstSw implements ActionListener { //…………………………………. JButton jbtn = new JButton (“OK”); //………………………………….. jbnt.addActionListener(new ActionListener() { public void actionPerformed (ActionEvent е) { // Действия по обработке события. } }); } Здесь применяется неименованный внутренний класс, реализующий интерфейс ActionListener. Задание : Разработать программу калькулятор JButton[] BtnNumber = new JButton[10]; //…………………………. // Layout для кнопок с цифрами for (int i = 0; i < BtnNumber.length; i++) { BtnNumber[i] = new Jbutton ("(" +i")"); BtnNumber[i].setActionCommand (""+i); BtnNumber[i].addActionListener(this); buttonPanel.add(BtnNumber[i]); } //………………………….. public void actionPerformed(ActionEvent e) { /* метод getActionCommand () возвращает в виде строки string, которая установлена методом setActionCommand (String s) */ String strBtn = e.getActionCommand(); //getSource() возвращает ссылку на компонент if (e.getSource().equals(btnOk)) { int secondNum = Integer.valueOf(txtEdit.getText()); // String Integer //………………………………. }