Консольное приложение с обработкой событий на 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.