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