Назад
Вперед
4.7. Аплет JDK 1.0 и мышь
Пример демонстрирует способы обработки
событий от клавиш мыши в модели JDK версии 1.0.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Демонстрация
(ваш браузер должен уметь работать с аплетами
Java)
Немного теории
Для обеспечения совместимости со старыми
браузерами, не способными работать с аплетами JDK
версии 1.1, вы можете использовать метод обработки
событий от мыши, принятый в JDK версии 1.0.
Для этого в главном классе аплета нужно
определить некоторые из перечисленных ниже
методов (выбрав их в соответствии с логикой
работы вашего приложения):
Метод |
Действие пользователя, в результате
которого метод получает управление |
mouseDown |
Нажатие на клавишу мыши, когда курсор
расположен в окне аплета |
mouseUp |
То же, но отжатие |
mouseEnter |
Курсор вошел в область окна аплета |
mouseExit |
Курсор вышел из этой области |
mouseMove |
Перемещение курсора мыши |
mouseDrag |
Операция переноса объектов:
пользователь нажимает клавишу мыши, перемещает
курсор и затем отпускает клавишу мыши |
Всем перечисленным выше методам передается
ссылка на объект-событие, а также координаты
курсора на момент возникновения события,
например:
public boolean mouseEnter(Event e,
int x, int y)
{
return true;
}
Для нас интересны два поля объекта-события. Это
поле clickCount и modifiers.
Первое из них содержит количество щелчков и
может быть использовано для того чтобы отличить
одиночные щелчки от двойных или тройных.
Поле modifiers позволяет узнать, какая из клавиш
двухклавишной мыши вызвала появление события.
Если в этом поле находится значение Event.META_MASK - то
это правая клавиша, а если Event.ALT_MASK - левая.
Описание примера
Окно нашего аплета реагирует на одиночные и
двойные щелчки, отделяя при этом щелчки левой и
правой клавишей мыши.
Если пользователь делает одиночный щелчок
левой клавишей мыши в окне аплета, то в месте
расположения курсора рисуется изображения
маленькой дискеты (рис. 1).
Рис. 1. Окно аплета с изображенными в нем
дискетами различного размера
Если сделан двойной щелчок левой клавишей мыши,
рисуется большая дискета. Щелчок правой клавишей
мыши стирает все нарисованные дискеты.
Рассмотрим исходный текст аплета.
Класс PutDisk
В главном классе аплета PutDisk мы определили
четыре поля и несколько методов:
import java.applet.Applet;
import java.awt.*;
public class PutDisk extends Applet
{
Image imFloppy;
int imHeight;
int imWidth;
Dimension dm;
. . .
}
Поле imFloppy хранит ссылку на изображение дискеты,
поля imHeight и imWidth - размеры этого изображения, а
поле dm - размеры окна аплета.
Метод init
Прежде всего метод init загружает изображение
дискеты, дожидаясь завершения процесса загрузки
с помощью класса MediaTracker:
MediaTracker tr = new MediaTracker(this);
imFloppy = getImage(getCodeBase(),
"disk.gif");
tr.addImage(imFloppy, 0);
try
{
tr.waitForAll();
}
catch (InterruptedException e) {}
Затем он определяет и сохраняет размеры
изображения:
imHeight = imFloppy.getHeight(this);
imWidth = imFloppy.getWidth(this);
Далее метод init определяет и сохраняет размеры
окна аплета:
dm = size();
В заключение метод init устанавливает цвет фона и
изображения:
setBackground(Color.white);
setForeground(Color.black);
Метод paint
Этот метод просто рисует рамку вокруг окна
аплета:
public void paint(Graphics g)
{
g.drawRect(0, 0,
dm.width - 1, dm.height - 1);
}
Метод mouseDown
Когда пользователь делает в окне аплета
одиночный или двойной щелчок клавишей мыши,
управление передается методу mouseDown.
Так как этот метод будет рисовать в окне аплета,
он прежде всего получает контекст отображения:
Graphics g = getGraphics();
Далее если был сделан двойной щелчок, метод
рисует изображение дискеты двойного размера:
if(e.clickCount > 1)
{
g.drawImage(imFloppy, x, y,
imWidth * 2, imHeight * 2, this);
}
Если был сделан щелчок правой клавишей мыши,
окно аплета перерисовывается, в результате чего
нарисованные там ранее дискеты исчезают:
else if(e.modifiers == Event.META_MASK)
{
repaint();
}
И, наконец, в случае одиночного щелчка левой
клавишей мыши рисуется маленькое изображение
дискеты:
else
g.drawImage(imFloppy, x, y, this);
Сделав свою работу, метод mouseDown возвращает
значение true - признак того, что обработка события
была произведена:
return true;
Методы mouseEnter и mouseExit
Хотя в нашем приложении эти методы не нужны и вы
можете их не определять, мы включили исходный
текст соответствующих заглушек для примера:
public boolean mouseEnter(Event e,
int x, int y)
{
return true;
}
public boolean mouseExit(Event e,
int x, int y)
{
return true;
}
Назад Вперед |