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

Библиотека примеров приложений Java

Оглавление
Коды клавиш

Ввод символов
Аплеты JDK 1.1 и клавиатура
Аплет JDK 1.0 и клавиатура
Мышь в JDK 1.1
Перемещение объектов
Аплет JDK 1.0 и мышь
Регулируем размер изображения
Автономное приложение и мышь

Назад Вперед

4.5. Работа с мышью в JDK 1.1

Пример демонстрирует способы обработки событий от мыши в модели JDK версии 1.1. Рассказано о применении методов интерфейса MouseListener.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Демонстрация
(ваш браузер должен уметь работать с аплетами Java в стандарте JDK 1.1)

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

Для обработки событий от мыши в JDK 1.1 предусмотрены два интерфейса - MouseListener и MouseMotionListener. Первый из них предназначен для обработки таких событий, как щелчок мышью внутри окна приложения Java, нажатие и отжатие клавиши мыши, вход курсора мыши в область экрана, занимаемую приложением и выход курсора из этой области. Второй интерфейс позволяет отслеживать перемещение курсора мыши.

В этом примере мы займемся интерфейсом MouseListener. Его регистрация выполняется при помощи метода addMouseListener.

Данный интерфейс предполагает реализацию следующих пяти методов:

Метод Действие пользователя, в результате которого метод получает управление
mousePressed Нажатие клавиши мыши
mouseReleased Отжатие клавиши мыши
mouseClicked Щелчок клавишей мыши в области окна приложения Java
mouseEntered Размещение курсора мыши в области окна приложения Java
mouseExited Вывод курсора мыши из области окна приложения Java

В качестве единственного параметра всем этим методам передается ссылка на объект класса MouseEvent, например:

public void mouseClicked(MouseEvent e)
{
}

При помощи этой ссылки приложение Java может извлечь самую разнообразную информацию о мыши на момент возникновения события.

Методы getX и getY возвращают координаты курсора мыши относительно окна приложения Java в пикселах по горизонтали и вертикали, соответственно. С помощью метода getPoint вы можете получить эту же информацию в виде ссылки на объект класса Point.

Метод getClickCount пригодится вам в том случае, если приложение должно уметь отличать одиночные и многократные (например, двойные) щелчки клавишей мыши. Этот метод возвращает значение счетчика количества щелчков на момент возникновения события. Например, для двойного щелчка возвращается значение 2.

А как определить, какая клавиша мыши вызвала появление события?

Строго говоря, этого делать не рекомендуется. Дело в том, что количество кнопок на мыши отличается для разных компьютерных платформ. И если пользователи персональных компьютеров на базе процессоров Intel имеют дело с двух- или трехкнопочными мышами, то владельцы компьютеров Apple довольствуются всего лишь однокнопочными.

Поэтому для обеспечения мобильности приложения Java обычно работают только с одной кнопкой мыши. При этом если мышь многокнопочная, то все кнопки выполняют одну и туже функцию.

Тем не менее, если вы абсолютно уверены, что ваше приложение будет работать только с многокнопочными мышами, вы можете различать события от отдельных кнопок. Для этого следует воспользоваться методом getModifiers из класса InputEvent (который является базовым для класса MouseEvent).

Каким образом?

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

Значение Клавиша мыши
InputEvent.BUTTON1_MASK Левая
InputEvent.BUTTON2_MASK или InputEvent.ALT_MASK Средняя
InputEvent.BUTTON3_MASK

или InputEvent.META_MASK

Правая

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

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

Окно аплета разделено сеткой на отдельные блоки прямоугольной формы (рис. 1).

pic1.gif (4931 bytes)

Рис. 1. Окно аплета, работающего с мышью

Если сделать одиночный щелчок левой клавишей мыши внутри блока, его цвет станет зеленым. Повторный одиночный щелчок восстанавливает желтый цвет блока.

Двойной щелчок левой клавишей мыши перекрашивает блок в красный цвет, а одиночный щелчок правой клавишей мыши - в черный.

Рассмотрим теперь исходный текст аплета.

Класс MouseBox

Главный класс аплета MouseBox реализует интерфейс MouseListener, позволяющий обрабатывать события от клавиш мыши:

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class MouseBox extends Applet 
  implements MouseListener
{
  . . .
}

В нем мы определили несколько полей и методов.

Поле dm хранит размеры окна аплета:

Dimension dm;

В полях nxBlockSize и nyBlockSize хранятся текущий размер блока в пикселах, соответственно, по горизонтали и по вертикали:

int nxBlockSize;
int nyBlockSize;

В поле nBlocks находится число блоков по вертикали и горизонтали:

static final int nBlocks = 10;

Следующие три двухмерных массива хранят состояние, количество щелчков мыши и значение флагов модификации для каждого блока:

boolean[][] bState;
int[][] nClickCount;
int[][] nMod;

Метод init

Этот метод выполняет все необходимые инициализирующие действия.

Прежде всего он определяет и сохраняет размеры окна аплета:

dm = getSize();

Далее исходя из этих размеров и количества блоков вычисляются размеры сторон блоков по горизонтали и вертикали:

nxBlockSize = dm.width / nBlocks;
nyBlockSize = dm.height / nBlocks;

На следующем шаге метод init создает три массива, предназначенные для хранения различных характеристик блоков:

bState = new boolean[nBlocks][nBlocks];
nClickCount = new int[nBlocks][nBlocks];
nMod = new int[nBlocks][nBlocks];

Затем в цикле выполняется инициализация созданных массивов:

int i, j;
for(i = 0; i < nBlocks; i++)
{
  for(j = 0; j < nBlocks; j++)
  {
    bState[i][j] = false;
    nClickCount[i][j] = 0;
    nMod[i][j] = 0;
  }
}  

В ячейки массива bState записывается значение false, что соответствует не закрашенному блоку. Ячейки остальных массивов инициализируются нулевыми значениями.

Далее метод init устанавливает цвет фона и изображения:

setBackground(Color.yellow);
setForeground(Color.black);

На последнем этапе метод init регистрирует интерфейс обработки событий от мыши MouseListener:

this.addMouseListener(this);

Метод paint

Метод paint рисует в окне аплета блоки в том состоянии, которое записано в указанных выше трех массивах.

Однако вначале он разлиновывает окно алпета на блоки, используя для этого красный цвет:

g.setColor(Color.red);
    
for(int x = 0; x <= nBlocks; x++)
{
  g.drawLine(x * nxBlockSize, 0,
    x * nxBlockSize, dm.height);
}
    
for(int y = 0; y <= nBlocks; y++)
{
  g.drawLine(0, y * nyBlockSize,
    dm.width, y * nyBlockSize);
}

Далее каждый блок закрашивается методом fillRect.

Для этого мы организовали двойной вложенный цикл:

for(int x = 0; x < nBlocks; x++)
{
  for(int y = 0; y < nBlocks; y++)
  {
    if(nClickCount[x][y] == 2)
      g.setColor(Color.red);
          
    else if(bState[x][y])
    {
      if(nClickCount[x][y] == 2)
        g.setColor(Color.red);
            
      else
      {  
        if(nMod[x][y] == InputEvent.META_MASK)
          g.setColor(Color.black);
        else  
          g.setColor(Color.green);
      }  
    }
    else
      g.setColor(Color.yellow);
          
    g.fillRect(
      x * nxBlockSize + 1,
      y * nyBlockSize + 1,
      nxBlockSize - 1, nyBlockSize - 1);
  }
}

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

Далее мы выполняем действия, необходимые для того чтобы отличить двойные и одиночные щелчки.

Если внутри блока был сделан двойной щелчок, в контекст отображения перед раскрашиванием выбирается красный цвет:

if(nClickCount[x][y] == 2)
  g.setColor(Color.red);
else
{  
  if(nMod[x][y] == InputEvent.META_MASK)
    g.setColor(Color.black);
  else  
    g.setColor(Color.green);
}

В противном случае мы проверяем флаг модификации, записанный обработчиком события в ячейку массива nMod.

Если он равен значению InputEvent.META_MASK (или InputEvent.BUTTON3_MASK), был сделан щелчок правой клавишей мыши. Мы в этом случае выбираем в контекст отображения черный цвет. Для щелчка левой клавишей мыши выбирается зеленый цвет.

Метод mousePressed

Метод mousePressed получает управление, когда пользователь располагает курсор мыши внутри окна нашего аплета и нажимает одну из клавиш мыши.

Прежде всего этот метод определяет текущий координаты курсора мыши и пересчитывает их в номер блока:

int xClick = e.getX() / nxBlockSize;
int yClick = e.getY() / nyBlockSize;

Далее состояние ячейки массива bState, соответствующее этому блоку, изменяется на противоположное:

bState[xClick][yClick] = 
    !bState[xClick][yClick];

В массив nClickCount мы записываем количество щелчков, сделанных внутри блока, а в массив nMod - флаги модификации, позволяющие определить, какой именно клавишей пользователь щелкнул в окне аплета:

nClickCount[xClick][yClick] = 
  e.getClickCount();
   
nMod[xClick][yClick] = e.getModifiers();

Затем окно аплета перерисовывается:

repaint();

Остальные методы интерфейса MouseListener

Эти методы необходимы нам только для полноты реализации интерфейса MouseListener, поэтому мы определили их пустыми:

public void mouseReleased(MouseEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}

Назад Вперед

[Назад]