Назад
Вперед
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).
Рис. 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)
{
}
Назад Вперед |