Консольное приложение с обработкой событий на Java

Консольное приложение с обработкой событий на Java

https://t.me/javatg


Наше приложение обрабатывает события, возникающие в создаваемом им окне класса Frame. События, связанные с мышью, обрабатыватываются методом handleEvent.


Немного теории

Автономные (консольные) приложения Java и аплеты могут создавать окна на базе класса Frame. Если эти окна используются для интерактивного взаимодействия с пользователем, вы должны организовать в соответствующих классах обработку событий, переопределив методы handleEvent, mouseDown, mouseMove и аналогичные.

При обработке событий в аплетах мы переопределяли перечисленные выше методы в главном классе аплета, который наследуется от класса Applet. Что же касается окон Frame, то они создаются на базе классов, произведенных от класса Frame. Именно там вы и должны переопределять методы, предназначенные для обработки событий.

В остальном события обрабатываются таким же образом, что и в аплетах.

Описание примера

Наше приложение отображает в своем окне коодинаты курсора в момент щелчка клавишей мыши (рис. 1). Цвет фона окна желтеет, когда пользователь располагает курсор мыши над поверхностью окна приложения и становится белым, когда курсор покидает эту область.

pic1.gif (2504 bytes)


Рис.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.


Report Page