Назад
Вперед
4.3. Аплеты тоже работают с клавиатурой
В окне аплета, исходный текст которогго
приведен в этом примере, находится черный
прямоугольник. Его можно перемещать при помощи
клавиш управления курсором. Здесь для обработки
клавиатурного ввода мы применили те же приемы,
что и в двух предыдущих автономных приложениях
Java. Однако теперь мы имеем дело с аплетом.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Демонстрация
(ваш браузер должен уметь работать с аплетами
Java в стандарте JDK 1.1)
Немного теории
В описании двух предыдущих примеров мы
рассказывали о том, как работать с клавиатурой в
автономных приложениях Java. Примененный нами
метод обработки событий от клавиатуры,
основанный на использовании интерфейса KeyListener,
подходит и для аплетов. При разработке такого
аплета вы должны предусмотреть класс,
реализующий указанный интерфейс и
обрабатывающий события. Это может быть, например,
главный класс аплета.
Заметим, что для просмотра аплета, исходные
тексты которого вы найдете в этом разделе нашей
библиотеки примеров, вы должны применять
браузер, способный работать с алпетами стандарта
JDK 1.1. Это может быть, например, браузер
операционной системы Windows 98.
Загрузив алпет, сделайте по его окну щелчок
клавишей мыши, чтобы аплет получил фокус
клавиатурного ввода. Затем можете проверять
аплет в действии.
Описание примера
Сразу после загрузки в центре окна нашего
алпета отображается маленький квадрат черного
цвета (рис. 1).
Рис. 1. Окно аплета MoveIt
Если аплет владеет фокусом ввода, то с помощью
клавиш перемещения курсора вы сможете
передвигать этот квадрат в пределах окна аплета.
При этом когда в процессе перемещения квадрат
достигает края окна, при попытке сдвига за этот
край он появляется с противоположной стороны
окна аплета.
Рассмотрим исходный текст аплета.
Главный класс аплета MoveIt
Для обработки событий от клавиатуры главный
класс аплета реализует интерфейс KeyListener:
public class MoveIt extends Applet
implements KeyListener
{
. . .
}
Поля nxCurrent и nyCurrent хранят текущие координаты
верхнего левого угла квадрата, которые
изменяются в процессе перемещения:
int nxCurrent;
int nyCurrent;
В поле dm класса Dimension мы записываем размеры окна
аплета:
Dimension dm;
И, наконец, в поле nBlockSize хранится константа -
половина размера стороны квадрата:
final static int nBlockSize = 10;
Метод init
Метод init получает управление при инициализации
аплета.
Прежде всего он определяет размеры окна аплета
и устанавливает исходные координаты квадрата:
dm = getSize();
nxCurrent = (dm.width / 2) - nBlockSize;
nyCurrent = (dm.height / 2) - nBlockSize;
В результате квадрат будет нарисован в центре
окна.
Далее метод init устанавливает цвет фона и
изображения:
setBackground(Color.yellow);
setForeground(Color.black);
На заключительной стадии инициализации
выполняется очень важное действие - регистрация
класса как обработчика событий от клавиатуры:
this.addKeyListener(this);
Метод paint
Задачей метода paint является рисование квадрата
в текущей позиции.
После получения управления этот метод
устанавливает в контексте отображения красный
цвет и рисует строку приглашения "Move it whith
keyboard!":
g.setColor(Color.red);
g.setFont(new Font(
"Helvetica", Font.BOLD, 24));
g.drawString("Move it whith keyboard!",
10, 30);
Квадрат рисуется при помощи функции DrawIt,
определенной в нашем приложении:
DrawIt(g);
В качестве единственного параметра этой
функции передается ссылка на контекст
отображения окна аплета.
Метод DrawIt
Метод DrawIt просто рисует квадрат, вызывая для
этого метод fillRect:
void DrawIt(Graphics g)
{
g.setColor(Color.black);
g.fillRect(nxCurrent, nyCurrent,
2 * nBlockSize, 2 * nBlockSize);
}
Квадрат рисуется черным цветом, установленным
предварительно в контекте отображения.
Начальные координаты квадрата (x, y) равны (nxCurrent,
nyCurrent), а размер стороны - (2 * nBlockSize).
Метод keyPressed
Этот метод получает управление всякий раз,
когда пользователь нажимает клавишу (при
условии, что окно аплета имеет фокус ввода).
Первым делом метод keyPressed определяет код
виртуальной клавиши, которая была нажата. Для
этого он вызывает метод getKeyCode:
int key = e.getKeyCode();
Далее при помощи оператора switch мы организовали
ветвление, выполняя отдельную обработку для
клавиш перемещения курсора.
Перемещение курсора влево
Здесь мы проверяем текущую координату
прямоугольника по оси X. Если она больше нуля, мы
уменьшаем ее на половину размера стороны
квадрата, а если меньше или равна - устанавливаем
равной ширине окна без удвоенного размера
стороны квадрата:
case KeyEvent.VK_LEFT:
{
if(nxCurrent > 0)
nxCurrent -= nBlockSize;
else
nxCurrent = dm.width - nBlockSize * 2;
break;
}
Перемещение курсора вправо
Когда при движении вправо квадрат достигает
правой границы окна аплета, мы устанавливаем его
горизонтальную координату равной нулю:
case KeyEvent.VK_RIGHT:
{
if(nxCurrent < dm.width - nBlockSize)
nxCurrent += nBlockSize;
else
nxCurrent = 0;
break;
}
Перемещение курсора вниз
При перемещении квадрата вниз мы проверяем
факт достижения нижней границы окна аплета:
case KeyEvent.VK_DOWN:
{
if(nyCurrent < dm.height - nBlockSize)
nyCurrent += nBlockSize;
else
nyCurrent = 0;
break;
}
Если пользователь пытается перейти через эту
границу, вертикальная координата квадрата
устанавливается равной нулю.
Перемещение курсора вверх
Аналогично, когда квадрат перемещается вверх,
мы проверяем пересечение верхней границы окна
аплета:
case KeyEvent.VK_UP:
{
if(nyCurrent > 0)
nyCurrent -= nBlockSize;
else
nyCurrent = dm.height - nBlockSize * 2;
break;
}
Перерисовка окна аплета
После каждого перемещения квадрата в любом
направлении мы перерисовываем окно аплета,
вызывая для этого метод repaint:
repaint();
В результате квадрат будет нарисован в новой
позиции.
Методы keyReleased и keyTyped
Эти методы не нужны для реализации логики
работы приложения, однако их необходимо
определить для полноты интерфейса KeyListener:
public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
Назад Вперед |