Тема 10. «События».
Обработка событий в java 2
Под событием будем понимать объект, который описывает изменение состояния источника (например, нажатие интерфейсной (управляющей) кнопки в фрейме окна дисплея изменяет ее состояние из «отпущена» в «утоплена»). В свою очередь источник – это объект, генерирующий событие (в данном примере кнопка). Одно и то же событие может быть значимым (существенным) для одних объектов и несущественным для других (либо существенным для одного и того же объекта в одном состоянии и несущественным в другом состоянии).
В версиях java до JDK 1.1 обработка событий осуществляется с помощью метода handleEvent(), т.е. для обработки события, произошедшего с компонентом (E), вызывается метод handleEvent() этого компонента. Если он возвращает значение true, то обработка события полностью завершена. Если false, то событие передается включающему контейнеру(D) для дальнейшей обработки (вернее методу handleEvent()) включающего контейнера), который также может возвратить true или false, что вызывает повторение описанного процесса. Если методы всех контейнеров вернули значение false, то событие обрабатывается виртуальной машиной java.
А
Иерархия включающих контейнеров (версии до JDK 1.1)
A - B - C - D и объект E.
Такой модели обработки событий присущи ряд недостатков:
- от компонента, в котором произошло событие, к контейнеру передаются все сообщения, а не только те, которые он может обработать;
- все события обрабатываются одними и теми же методами, что повышает вероятность ошибки;
- специальные значения событий передаются в виде строк символов, эффективность обработки которых не достаточно высока;
- чтобы разделить обработку событий сгенерированных интерактивными элементами одного типа, нужно создать новые подклассы на основе существующих.
ПРИМЕР:
import java.awt.*; //подключение пакета оконного пользовательского
//интерфейса
import java.applet.*; //подключение библиотеки апплета
public class Mouse extends Applet //наследование от класса Applet
{int pos_x=218, pos_y=245;
//начальная позиция окна вывода координат
//в принципе можно и не инициализировать, тогда имеем 0,0
Buttonbutton_1; //Объектная ссылка класса Button
public void init() //клас Applet вызывает методы init()и start()
//здесь метод init() переопределяется
{
setBackground(Color.gray); //установка цвета фона
setForeground(Color.red); //установка цвета переднего плана,
//выводимые координаты -красного цвета
Label label_1=new Label("Обработка перемещений мыши",Label.LEFT);
add(label_1); // Label
button_1= new Button("Close"); //Создание объекта
button_1.reshape(10,10,100,40); //прорисовка
add(button_1); //добавление к контейнеру
//this.requestFocus();
}
public void paint(Graphics g)
{
//Прорисовка прямоугольника для динамического вывода
//координат курсора
g.drawLine(pos_x-3,pos_y-11,pos_x+80,pos_y-11);
g.drawLine(pos_x-3,pos_y-11,pos_x-3,pos_y+3);
g.drawLine(pos_x-3,pos_y+3,pos_x+80,pos_y+3);
g.drawLine(pos_x+80,pos_y-11,pos_x+80,pos_y+3);
g.drawString("X="+pos_x+"; Y="+pos_y, pos_x,pos_y);
}
public boolean action(Event ev,Object arg)
{int a1,a2;
//можно обработать через свойство id и константу, сгенерир. управл. эл
if (ev.id==ev.ACTION_EVENT)
{showStatus("Клик_левыйнакнопке Cancel:id="+ev.id+"; A_E="+ev.ACTION_EVENT+"arg="+arg);
repaint();}
return true;
}
/*public boolean handleEvent(Event ev)
//можно обработать через главный обработчик
{ //главный обработчик
if (ev.target==button_1) //откуда пришло событие
{showStatus("Клик_левый на кнопке Cancel:X="+pos_x+"; Y="+pos_y);
repaint();return true;}
else
return super.handleEvent(ev);}
*/
//если не от кнопки,
//то вернуть событие на обработку
/*if (ev.target instanceof Mouse)
mouseDown(ev,pos_x,pos_y);
return true;
}*/
public boolean mouseDown(Event ev, int x, int y)
{ //обработка нажатия кнопки мыши
showStatus("Клик мышью с координатами: X="+pos_x+"; Y="+pos_y);
return true;
}
public boolean mouseMove(Event ev, int x, int y)
{ //обработка перемещения курсора мыши
pos_x=x; //выбор координат в доступные переменные
pos_y=y;
repaint();
return true;
}
}
/*Удивительно, что название button_1 = Close закрывает*/
Модель делегирования событий.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.