Методические указания. Апплет должен быть создан на основе шаблонов, содержащихся в Приложении 5(или при помощи системы Java Applet Wizard).

Объявление элементов класса апплета.

В классе апплета объявим следующие элементы:

int xDown, yDown; // координаты нажатия клавиши

int xPrev, yPrev; // предыдущие координаты конца линии

boolean bDrawing; // признак включения/выключения режима рисования

Vector lines; // массив координат линий

В массив lines типа Vector будем добавлять элементы типа Rectangle, которые будут содержать координаты линии (класс Rectangle содержит элементы x, y, width, height, сохраненная линия будет идти от (x, y) до (x+width, y+height)). Для того, чтобы использовать класс Vector, в файл класса апплета импортируем пакет java.util:

import java.util.*;

Инициализация апплета ( метод init()).

При инициализации апплета в методе init() установим признак bDrawing равным false (установлен признак выключения режима рисования) и создадим массив lines при помощи конструктора без параметров Vector().

Перерисовка окна апплета (метод paint()).

Для перерисовки изображения в окне используется метод paint(), которому передается объект g типа Graphics (g - контекст отображения для окна). Методами этого класса пользуются для вывода графической информации в окно апплета.

Сначала раскрасим фон окна и нарисуем рамку окна. Для этого сделаем следующие действия: при помощи метода size() класса апплета получим текущий размер окна - объект appSize типа Dimension; методом g.setColor() выберем цвет фона Color.yellow; зарисуем всю внутреннюю область окна с помощью метода g.fillRect() и объекта appSize; методом g.setColor() выберем цвет рамки Color.black; нарисуем рамку вокруг окна методом g.drawRect(), используя объект appSize.

Дальше следует вывод всех уже нарисованных линий. Для этого: получим размер массива lines с помощью метода lines.size(); затем в цикле получим координаты каждой (i-той) линии и нарисуем ее

Rectangle p=(Rectangle)lines.elementAt(i);

g.drawLine(p.x, p.y, p.x+p.width, p.y+p.height);

После вывода всего изображения установим признак выключения режима рисования.

Обработка нажатия клавиши мыши (метод mouseDown()).

Если сделан двойной щелчок мышью, то очистим массив lines методом lines.removeAllElements() и перерисуем содержимое окна вызовом метода repaint().

Иначе, если произошло просто нажатие на клавишу, то необходимо сохранить начальную координату линии. Для этого запомним в элементах xDown и yDown координаты начала линии, которые содержатся в параметрах x и y, передаваемых методу mouseDown(). Предыдущие координаты конца линии xPrev и yPrev для процесса рисования сначала установим равными началу линии. Затем установим признак включения режима рисования.

Обработка отпускании клавиши мыши (метод mouseUp()).

Если установлен признак включения режима рисования, то это значит, что данная координата указателя является конечной точкой линии, и что координаты линии необходимо запомнить в массиве lines. Поэтому создадим новый объект Rectangle и добавим его в массив lines:

Rectangle p=new Rectangle(xDown,yDown,x-xDown,y-yDown);

lines.addElement(p);

Затем перерисуем содержимое окна методом repaint() и установим признак выключения режима рисования.

Обработка перемещения указателя мыши при нажатой клавише (метод mouseDrag()).

Для того, чтобы что-то нарисовать в окне апплета вне метода paint(), необходимо получить контекст отображения (методу paint() этот контекст передается через параметр). Получим этот контекст методом апплета getGraphics():

Graphics g=getGraphics();

Затем удалим изображение линии, нарисованное ранее. Для этого методом g.setColor() выберем цвет фона Color.yellow и нарисуем линию от (xDown, yDown) до (xPrev, yPrev) методом g.drawLine().

Нарисуем новую линию, установив методом g.setColor() цвет Color.black и проведя методом g.drawLine() линию от (xDown, yDown) до (x, y). Параметры x и y передаются методу mouseDrag().

Предыдущие координаты конца линии xPrev и yPrev для процесса рисования установим теперь равными x и y соответственно. После этого установим признак включения режима рисования.

Обработка перемещения указателя мыши без нажатой клавиши (метод mouseMove()).

В этом методе просто установим признак выключения режима рисования.

2.4 События от клавиатуры

Апплет может обрабатывать события, создаваемые клавиатурой. Он может реагировать на нажатие и отпускание функциональных клавиш F1 - F12, клавиш перемещения курсора, обычных клавиш.

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

public boolean keyDown(Event evt,int nkey);

public boolean keyUp(Event evt,int nkey);

Первый параметр этих функция - объект класса Event, который несет всю информацию о событии. Наибольший интерес представляют элементы key и modifiers переменной evt. Через них передается соответственно код нажатой клавиши и код модификации.

Второй параметр key методов keyDown() и keyUp() дублирует элемент key объекта evt.

Замечание. Прежде чем апплет будет способен принимать события от клавиатуры, ему нужно передать фокус ввода. Это можно сделать, щелкнув в окне левой клавишей мыши. Фокус ввода - это атрибут, который присваивается окну, обрабатывающему события от клавиатуры. Так как клавиатура одна, а апплетов и других активных мнокон на экране может быть много, необходим механизм, позволяющий определить, в какое окно направляется событие, создаваемое клавиатурой. Такой механизм и обеспечивается атрибутом фокуса ввода.

2.5 Приложение KeyCodes

Задание. Создать апплет двойного назначения KeyCodes, в окне которого отображаются символы, соответствующие нажимаемым клавишам, код соответствующей клавиши и коды модификации. В процессе отображения новые строки должны появляться в верхней части окна, а старые сдвигаться вниз после отпускания клавиши (должна быть организована свертка в окне).