Назад
2.10. Консольное приложение с обработкой событий
Наше приложение обрабатывает события,
возникающие в создаваемом им окне класса Frame.
События, связанные с мышью, обрабатыватываются
методом handleEvent.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Немного теории
Автономные (консольные) приложения Java и аплеты
могут создавать окна на базе класса Frame. Если эти
окна используются для интерактивного
взаимодействия с пользователем, вы должны
организовать в соответствующих классах
обработку событий, переопределив методы handleEvent,
mouseDown, mouseMove и аналогичные.
При обработке событий в аплетах мы
переопределяли перечисленные выше методы в
главном классе аплета, который наследуется от
класса Applet. Что же касается окон Frame, то они
создаются на базе классов, произведенных от
класса Frame. Именно там вы и должны переопределять
методы, предназначенные для обработки событий.
В остальном события обрабатываются таким же
образом, что и в аплетах.
Описание примера
Наше приложение отображает в своем окне
коодинаты курсора в момент щелчка клавишей мыши (рис.
1). Цвет фона окна желтеет, когда пользователь
располагает курсор мыши над поверхностью окна
приложения и становится белым, когда курсор
покидает эту область.
Рис.1. Отображение координат курсора в окне
приложения
В главном классе консольного приложения
EventProcFrame определена статическая функция main:
public class EventProcFrame
{
public static void main(String args[])
{
FrameWindow frame;
frame = new FrameWindow("Frame window");
frame.show();
}
}
Задачей этой функции является создание окна
класса FrameWindow, определенного в нашем приложении
на базе класса Frame.
В классе FrameWindow мы определили
поле ev класса Event, конструктор, методы paint и handleEvent:
class FrameWindow extends Frame
{
Event ev = null;
public FrameWindow(String szTitle)
{
. . .
}
public void paint(Graphics g)
{
. . .
}
public boolean handleEvent(Event evt)
{
. . .
}
}
Поле ev используется для временного хранения
объекта-события, связанного с мышью. Оно
инициализируется значением null.
Конструктор класса FrameWindow вызывает конструктор
базового класса Frame, передавая ему заголовок
окна, устанавливает размеры окна, цвет фона и
текста:
public FrameWindow(String szTitle)
{
super(szTitle);
resize(350, 200);
setBackground(Color.white);
setForeground(Color.black);
}
Метод paint проверяет содержимое поля ev:
public void paint(Graphics g)
{
if(ev != null)
{
g.drawString("[" + ev.x +
"," + ev.y + "]", ev.x, ev.y);
}
super.paint(g);
}
Если оно не равно null, то метод отображает
координаты, связанные с событием. Эти координаты
отображаются в точке расположения курсора мыши.
Перед завершением своей работы метод paint
вызывает метод paint родительского класса Frame, что
необходимо для правильной прорисовки окна.
Метод handleEvent обрабатывает несколько событий:
WINDOW_DESTROY, Event.MOUSE_DOWN, Event.MOUSE_ENTER и Event.MOUSE_EXIT:
public boolean handleEvent(Event evt)
{
if(evt.id == Event.WINDOW_DESTROY)
{
setVisible(false);
System.exit(0);
return true;
}
else if(evt.id == Event.MOUSE_DOWN)
{
ev = evt;
repaint();
return true;
}
else if(evt.id == Event.MOUSE_ENTER)
{
setBackground(Color.yellow);
repaint();
return true;
}
else if(evt.id == Event.MOUSE_EXIT)
{
setBackground(Color.white);
repaint();
return true;
}
else
return super.handleEvent(evt);
}
}
При обработке события Event.WINDOW_DESTROY метод handleEvent
скрывает окно FrameWindow и завершает работу
виртуальной машины Java.
Когда пользователь делает щелчок клавишей мыши
в окне FrameWindow, возникает событие Event.MOUSE_DOWN. Его
обработчик сохраняет ссылку на объект-событие в
поле ev, а затем перерисовывает окно FrameWindow при
помощи метода repaint. В результате будет вызван
метод paint и в окне появятся координаты курсора.
События Event.MOUSE_ENTER и Event.MOUSE_EXIT вызывают в нашем
приложении изменение цвета фона окна. Когда
пользователь размещает курсор мыши над окном
приложения, фон желтеет, а когда убирает курсор
за пределы окна - становится белым. Это
достигается вызовом в обработчике этих событий
метода setBackground с последующей перерисовкой окна
методом repaint.
Назад |