Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 1

© Александр Фролов, Григорий Фролов
Том 30, М.: Диалог-МИФИ, 1997, 288 стр.

[Назад] [Содеожание] [Дальше]

Приложение MouseClick

Аплет MouseClick демонстрирует обработку событий, поступающих от мыши.

Когда мы создавали проект этого аплета, то в третьей диалоговой панели системы Java Applet Wizard включили три переключателя в поле Which mouse event handlers would you like added (рис. 4.1).

Рис. 4.1. Включение обработчиков событий от мыши

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

Мы изменили эти методы таким образом, чтобы в ответ на различные действия, выполняемые пользователем с помощью мыши, аплет реагировал соответствующим образом:

Действие пользователя

Реакция аплета

Перемещение курсора мыши при отжатой клавише

Игнорирование

Перемещение курсора мыши при нажатой клавише

В строку состояния записывается текстовая строка Mouse Drag

Нажатие клавиши мыши

В месте расположения курсора выводятся текущие координаты курсора мыши. Дополнительно в строку состояния записывается текстовая строка Mouse Down

Отжатие клавиши мыши

В строку состояния записывается текстовая строка Mouse Up

Курсор мыши входит в область окна аплета

В строку состояния записывается текстовая строка Mouse pointer enters applet's window

Курсор мыши выходит из области окна аплета

В строку состояния записывается текстовая строка Mouse pointer leaves applet's window

Внешний вид окна аплета, в котором отображаются координаты курсора, показан на рис. 4.2.

Рис. 4.2. Внешний вид окна аплета MouseClick, в котором отображаются координаты курсора

Исходные тексты приложения

Файл исходного текста приложения MouseClick представлен в листинге 4.1.

Листинг 4.1. Файл MouseClick\MouseClick.java


// =========================================================
// Обработка событий от мыши
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//            или
//         http://www.dials.ccas.ru/frolov
// =========================================================
import java.applet.*;
import java.awt.*;

public class MouseClick extends Applet
{
  // Текущие координаты курсора при нажатии на 
  // кнопку мыши
  Dimension dimMouseCursor;

  // Временная переменная для хранения события
  Event ev;

  // -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
  public String getAppletInfo()
  {
    return "Name: MouseClick\r\n" +
      "E-mail: frolov@glas.apc.org" +
      "WWW:    http://www.glasnet.ru/~frolov" +
      "Author: Alexandr Frolov\r\n" +
      "Created with Microsoft Visual J++ Version 1.0";
  }

  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
  public void paint(Graphics g)
  {
    // Определяем текущие размеры окна аплета
    Dimension dimAppWndDimension = size();
    
    // Выбираем в контекст отображения желтый цвет
    g.setColor(Color.yellow);
    
    // Закрашиваем внутреннюю область окна аплета
    g.fillRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    // Выбираем в контекст отображения черный цвет
    g.setColor(Color.black);

    // Рисуем рамку вокруг окна аплета
    g.drawRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    // Отображаем текущие координаты курсора мыши
    // в точке, где находится этот курсор
    g.drawString("(" + ev.x + "," + ev.y + ")", ev.x, ev.y);
  }

  // -------------------------------------------------------
  // mouseDown
  // Обработка щелчка кнопкой мыши
  // -------------------------------------------------------
  public boolean mouseDown(Event evt, int x, int y)
  {
    // Определяем и сохраняем текущие координаты
    // курсора мыши
    dimMouseCursor = new Dimension(x, y);
    
    // Сохраняем событие во временной переменной
    ev = evt;

    // Если количествао щелчков больше 1, считаем что
    // сделан двойной щелчок
    if(evt.clickCount > 1)
      
      // Выводим сообщение о двойном щелчке
      showStatus("Mouse Double Click");

    // Сделан одиночный щелчок
    else

      // Выводим сообщение о простом щелчке
      showStatus("Mouse Down");
    
    // Перерисовываем окно аплета
    repaint();

    // Возвращаем значение true при успешной
    // обработке события
    return true;
  }

  // -------------------------------------------------------
  // mouseUp
  // Отпускание клавиши мыши
  // -------------------------------------------------------
  public boolean mouseUp(Event evt, int x, int y)
  {
    // Выводим сообщение в строке состояния
    showStatus("Mouse Up");
      return true;
  }

  // -------------------------------------------------------
  // mouseDrag
  // Перемещение курсора мыши при нажатой клавише
  // -------------------------------------------------------
  public boolean mouseDrag(Event evt, int x, int y)
  {
    // Выводим сообщение в строке состояния
    showStatus("Mouse Drag");
    return true;
  }

  // -------------------------------------------------------
  // mouseMove
  // Перемещение курсора мыши при отжатой клавише
  // -------------------------------------------------------
  public boolean mouseMove(Event evt, int x, int y)
  {
    return true;
  }

  // -------------------------------------------------------
  // mouseEnter
  // Курсор мыши вошел в область окна аплета
  // -------------------------------------------------------
  public boolean mouseEnter(Event evt, int x, int y)
  {
    // Выводим сообщение в строке состояния
    showStatus("Mouse pointer enters applet's window");
    return true;
  }

  // -------------------------------------------------------
  // mouseExit
  // Курсор мыши покинул область окна аплета
  // -------------------------------------------------------
  public boolean mouseExit(Event evt, int x, int y)
  {
    // Выводим сообщение в строке состояния
    showStatus("Mouse pointer leaves applet's window");
    return true;
  }
}

Исходный текст документа HTML, созданного для нашего аплета системой Java Applet Wizard, приведен в листинге 4.2.

Листинг 4.2. Файл MouseClick\MouseClick.html


<html>
<head>
<title>MouseClick</title>
</head>
<body>
<hr>
<applet
    code=MouseClick.class
    id=MouseClick
    width=320
    height=240 >
</applet>
<hr>
<a href="MouseClick.java">The source.</a>
</body>
</html>

Описание исходного текста

В исходном тексте класса MouseClick мы определили поля класса с именами dimMouseCursor и ev:


Dimension dimMouseCursor;
Event ev;

Первое из них предназначено для хранения координат курсора в момент возникновения события, а второе - хранит ссылку на это событие.

Метод getAppletInfo

Метод getAppletInfo ничем не отличается от аналогичных методов в предыдущих приложениях.

Метод paint

В начале своей работы метод paint определяет текущие размеры окна аплета, закрашивает это окно в желтый цвет и рисует вокруг него тонкую рамку черного цвета. Все это делается исключительно для того чтобы выделить аплет в документе HTML и обозначить его границы.

Далее метод paint отображает текущие координаты курсора мыши, взяв их из переменной ev:


g.drawString("(" + ev.x + "," + ev.y + ")", ev.x, ev.y);

Метод mouseDown

Когда пользователь делает щелчок левой клавишей мыши (напомним, что Java не работает с другими клавишами мыши), управление получает метод mouseDown.

Этот метод, переопределенный в нашем приложении, прежде всего сохраняет текущие координаты курсора мыши в переменной dimMouseCursor класса Dimension:


dimMouseCursor = new Dimension(x, y);

Событие, которое передается методу mouseDown через первый параметр, сохраняется в переменной ev:


ev = evt;

Далее метод mouseDown проверяет поле clickCount параметра evt:


if(evt.clickCount > 1)
  showStatus("Mouse Double Click");
else
  showStatus("Mouse Down");

В это поле записывается кратность щелчка мыши. Если пользователь сделал двойной щелчок, в строке состояния отображается текстовая строка Mouse Double Click, а если одинарный - строка Mouse Down.

Обратите внимание на метод showStatus. Этот метод позволяет аплету отобразить любую текстовую строку в строке состояния навигатора, поэтому он часто используется для отладки или выдачи текущей информации о состоянии аплета.

Заметим, однако, что в документе HTML может располагаться несколько разных аплетов, а строка состояния навигатора только одна. Поэтому сообщения от разных аплетов могут перекрывать друг друга, в результате чего в строке состояния появится только то сообщение, которое было записано туда последним.

После записи сообщения в строку состояния метод mouseDown перерисывывает окно аплета, вызывая для этого метод repaint:


repaint();

В результате вызова метода repaint происходит инициирование вызова метода paint, выполняющего перерисовку содержимого окна аплета. Однако не следует думать, будто метод repaint просто вызывает метод paint. Метод paint вызывается интерпретатором Java асинхронно по отношению к методу repaint в подходящий момент времени.

В последней строке метод mouseDown возвращает значение true:


return true;

Этим он сообщает, что обработка события завершена и это событие не нужно передавать обработчику из базового класса.

Методы mouseUp, mouseDrag, mouseEnter, mouseExit

Обработчики методов mouseUp, mouseDrag, mouseEnter и mouseExit выглядят одинаково:


public boolean mouseUp(Event evt, int x, int y)
{
  // Выводим сообщение в строке состояния
  showStatus("Mouse Up");
    return true;
}

Пользуясь методом showStatus, эти методы записывают соответствующее сообщение в строку состояния и возвращают значение true.

Метод mouseMove

Метод mouseMove выглядит следующим образом:


public boolean mouseMove(Event evt, int x, int y)
{
  return true;
}

Он ничего не делает, кроме того что возвращает значение true, блокируя обработку события, выполняемую в базовом классе.

[Назад] [Содеожание] [Дальше]