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

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

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

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

Назад Вперед

4.3. Аплеты тоже работают с клавиатурой

В окне аплета, исходный текст которогго приведен в этом примере, находится черный прямоугольник. Его можно перемещать при помощи клавиш управления курсором. Здесь для обработки клавиатурного ввода мы применили те же приемы, что и в двух предыдущих автономных приложениях Java. Однако теперь мы имеем дело с аплетом.

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

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

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

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

В описании двух предыдущих примеров мы рассказывали о том, как работать с клавиатурой в автономных приложениях Java. Примененный нами метод обработки событий от клавиатуры, основанный на использовании интерфейса KeyListener, подходит и для аплетов. При разработке такого аплета вы должны предусмотреть класс, реализующий указанный интерфейс и обрабатывающий события. Это может быть, например, главный класс аплета.

Заметим, что для просмотра аплета, исходные тексты которого вы найдете в этом разделе нашей библиотеки примеров, вы должны применять браузер, способный работать с алпетами стандарта JDK 1.1. Это может быть, например, браузер операционной системы Windows 98.

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

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

Сразу после загрузки в центре окна нашего алпета отображается маленький квадрат черного цвета (рис. 1).

pic1.gif (1848 bytes)

Рис. 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)
{
}

Назад Вперед

[Назад]