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

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

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

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

Назад Вперед

4.4. Аплет JDK 1.0 и клавиатура

Для обеспечения совместимости с максимальным числом версий браузеров иногда приходится применять интерфейс JDK 1.0. Модель обработки событий JDK 1.0 допускает работу с клавиатурой.

Наш следующий пример внешне похож на предыдущий, однако в нем использована старая модель обработки событий, принятая в JDK 1.0.

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

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

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

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

Размещая свой аплет на сервере Web в сети Internet, вы возможно захотите, чтобы им смогли воспользоваться как можно большее число посетителей. Так как, к сожалению, на компьютерах посетителей не всегда установлены браузеры самых новых версий, иногда приходится ограничивать себя рамками устаревшего интерфейса JDK 1.0.

Для обработки событий от клавиатуры в главном классе аплета (или в классе, созданном на базе класса Frame в случае автономного приложения) вы должны определить методы keyDown и keyUp:

public boolean keyDown(Event evt, int key) 
{
  . . .
  return true;
}

public boolean keyUp(Event evt, int nKey) 
{
  . . .
  return true;
}

Первый из них получит управление при нажатии на клавишу, второй - при отжатии клавиши. Дополнительно окно аплета должно иметь фокус клавиатурного ввода.

Через параметр nKey данным методам передается код виртуальной клавиши, вызвавшей событие. В классе Event определены значения этого кода для некоторых клавиш:

Значение Клавиша
DOWN Клавиша перемещения курсора вниз
END <End>
F1-F12 <F1>, <F2>, …, <F12>
HOME <Home>
LEFT Клавиша перемещения курсора влево
PGDN <Page Down>
PGUP <Page Up>
RIGHT Клавиша перемещения курсора вправо
UP Клавиша перемещения курсора вниз

Через первый параметр методам keyDown и keyUp передается ссылка на объект-событие. Особый интерес представляют поля key и modifiers этого объекта.

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

Значение Описание
ALT_MASK Была нажата клавиша <Alt>
META_MASK Была нажата мета-клавиша (клавиша для ввода диактрических символов)
CTRL_MASK Была нажата клавиша <Ctrl>
SHIFT_MASK Была нажата клавиша <Shift>

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

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

pic1.gif (1848 bytes)

Рис. 1. Окно приложения KeyChar

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

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

Главный класс аплета MoveIt

Главный класс типичен для обычных аплетов. В нем определены четыре поля и несколько методов.

Поля 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);

Метод 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).

Метод keyDown

Этот метод получает управление всякий раз, когда пользователь нажимает клавишу (при условии, что окно аплета имеет фокус ввода).

public boolean keyDown(Event evt, int key) 
{
  . . .
}

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

Далее, как и в предыдущем приложении, при помощи оператора switch мы организовали ветвление, выполняя отдельную обработку для клавиш перемещения курсора.

Перемещение курсора влево

Здесь мы проверяем текущую координату прямоугольника по оси X. Если она больше нуля, мы уменьшаем ее на половину размера стороны квадрата, а если меньше или равна - устанавливаем равной ширине окна без удвоенного размера стороны квадрата:

case Event.LEFT:
{
  if(nxCurrent > 0)
    nxCurrent -= nBlockSize;
  else 
    nxCurrent = dm.width - nBlockSize * 2;
  break;
}

Обратите внимание на константу LEFT - ее значение определено в класса Event.

Перемещение курсора вправо

Когда при движении вправо квадрат достигает правой границы окна аплета, мы устанавливаем его горизонтальную координату равной нулю:

case Event.RIGHT:
{
  if(nxCurrent < dm.width - nBlockSize)
    nxCurrent += nBlockSize;
  else 
    nxCurrent = 0;
  break;
}
Перемещение курсора вниз

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

case Event.DOWN:
{
  if(nyCurrent < dm.height - nBlockSize)
    nyCurrent += nBlockSize;
  else 
    nyCurrent = 0;
  break;
}

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

Перемещение курсора вверх

Аналогично, когда квадрат перемещается вверх, мы проверяем пересечение верхней границы окна аплета:

case Event.UP:
{
  if(nyCurrent > 0)
    nyCurrent -= nBlockSize;
  else 
    nyCurrent = dm.height - nBlockSize * 2;
  break;
}
Перерисовка окна аплета

После каждого перемещения квадрата в любом направлении мы перерисовываем окно аплета, вызывая для этого метод repaint:

repaint();

В результате квадрат будет нарисован в новой позиции.

Метод keyUp

Этот метод не используется в нашем приложении и вы можете его не определять. Мы включили его в исходный текст приложения только для примера:

public boolean keyUp(Event evt, int nKey) 
{
  return true;
}

Назад Вперед

[Назад]