Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Работа 3

.pdf
Скачиваний:
7
Добавлен:
22.05.2015
Размер:
510.19 Кб
Скачать

11

пользователь отпустил клавишу.

Перемещение курсора мыши. Когда пользователь перемещает курсор мыши над окном апплета, в процессе перемещения происходит вызов метода

public boolean mouseMove(Event evt, int x, int y);

Через переменные x и y передаются текущие координаты курсора мыши.

Перемещение курсора мыши с нажатой клавишей. Операция «Drag and Drop» выполняется следующим образом: пользователь нажимает клавишу мыши и начинает перемещать курсор мыши, не отпуская клавиши. При этом происходит вызов метода

public boolean mouseDrag(Event evt, int x, int y);

Через переменные x и y передаются текущие координаты курсора мыши. Метод mouseDrag() вызывается даже в том случае, если в процессе перемещения курсор вышел за пределы окна апплета.

Вход курсора мыши в область окна. Когда курсор мыши в процессе перемещения по экрану попадает в область окна, управление передается методу

public boolean mouseEnter(Event evt, int x, int y);

Этот метод можно использовать для активизации апплета, на который указывает курсор мыши.

Выход курсора мыши в области окна. Если курсор покидает область окна апплета, вызывается метод

public boolean mouseExit(Event evt, int x, int y);

Если пользователь убрал из окна апплета, активизированного методом mouseEnter(), то метод mouseExit() может переключить апплет в пассивное состояние.

Приложение LinesDraw

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

 

12

сделать двойной щелчок в окне. При

этом из массива координат должны

будут удалены все элементы.

 

Методические указания. Апплет должен быть создан на основе шаблонов, содержащихся в Приложении 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.

13

Дальше следует вывод всех уже нарисованных линий. Для этого: получим размер массива 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();

14

Затем удалим изображение линии, нарисованное ранее. Для этого методом 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()).

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

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

Апплет может обрабатывать события, создаваемые клавиатурой. Он может реагировать на нажатие и отпускание функциональных клавиш 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.

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

15

Приложение KeyCodes

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

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

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

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

int yHeight; // высота символов шрифта, выбранного по умолчанию

Dimension appSize; // текущий размер окна апплета

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

При инициализации апплета в методе init() получим высоту символов шрифта для вывода текста в окно.

Для того, чтобы получить информацию о контексте окна апплета вне метода paint(), необходимо получить контекст отображения (методу paint() этот контекст передается через параметр). Получим этот контекст g класса Graphics методом апплета getGraphics() (cм. приложение LinesDraw).

Затем получим объект fm класса FontMetrics, который содержит метрики текущего шрифта, методом g.getFontMetrics() (приложение FontsList).

Сохраним высоту символов, выдаваемую методом fm.getHeight(), в переменной yHeight. Эта величина нужна для определения шага свертки.

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

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

В данном апплете этот метод используется для определения текущего размера appSize окна и для закраски фона окна и рисовании рамки окна (см. приложе-

ние LinesDraw).

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

 

16

Переопределим в классе апплета ме-

тод-обработчик нажатия клавиши кла-

виатуры keyDown(). В этом методе будем выводить строку информации о нажатой клавише в верхней части окна. Сначала сформируем объект s класса

String, равный

"Character "+(char)key+" -> Key "+key+" -> Modifiers "+evt.modifiers

затем получим методом getGraphics() контекст окна g класса Graphics и выведем в окно строку s в точке с координатами (10, yHeight) методом g.drawString().

Метод keyDown() должен возвратить true, так как обработка завершена.

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

Переопределим в классе апплета метод-обработчик отпускания клавиши клави-

атуры keyUp().

Получим методом getGraphics() контекст окна g класса Graphics и с помощью метода g.copyArea() скопируем часть экрана, ограниченную прямоугольником с началом в точке (0, 1), шириной appSize.width-1 и высотой appSize.height- yHeight-5, в область с началом в точке (0, yHeight+1).

Затем методом g.setColor() выберем цвет фона Color.yellow и методом g.fillRect() закрасим область вывода очередной строки - прямоугольник с нача-

лом в точке (1, 1), шириной appSize.width-2 и высотой yHeight+1.

Метод keyUp() должен возвратить true, так как обработка завершена.