Консольное приложение с обработкой событий на Java
https://t.me/javatgНаше приложение обрабатывает события, возникающие в создаваемом им окне класса Frame. События, связанные с мышью, обрабатыватываются методом handleEvent.
Немного теории
Автономные (консольные) приложения 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.