Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 1© Александр Фролов, Григорий ФроловТом 30, М.: Диалог-МИФИ, 1997, 288 стр. Приложение KeyCodeДля демонстрации методов обработки клавиатурных событий мы подготовили аплет KeyCode. В его окне отображаются символы, соответствующие нажимаемым клавишам, код соответствующих клавиш и коды модификации (рис. 4.4).
Рис. 4.4. Окно аплета KeyCode Аплет KeyCode интересен тем, что в процессе отображения новые строки появляются в верхней части окна, а старые сдвигаются вниз после отпускания клавиши. Таким образом, мы организовали свертку в окне аплета. Прежде чем нажимать клавиши, вы должны передать фокус вода окну аплета. Это можно сделать, щелкнув в окне левой клавишей мыши. Фокус ввода - это атрибут, который присваивается окну, обрабатывающему ввод от клавиатуры. Так как клавиатура одна, а аплетов и других активных окон на экране может быть много, необходим механизм, позволяющий определить, в какое окно направялются события, создаваемые клавиатурой. Такой механизм и обеспечивается атрибутом фокуса ввода. Исходные тексты приложения KeyCodeФайл исходного текста приложения KeyCode приведен в листинге 4.5. Листинг 4.5. Файл KeyCode\KeyCode.java
// =========================================================
// Просмотр кодов клавиш
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW: http://www.glasnet.ru/~frolov
// или
// http://www.dials.ccas.ru/frolov
// =========================================================
import java.applet.*;
import java.awt.*;
public class KeyCode extends Applet
{
// Высота символов текущего шрифта
int yHeight;
// Текущие размеры окна аплета
Dimension dimAppWndDimension;
// -------------------------------------------------------
// getAppletInfo
// Метод, возвращающей строку информации об аплете
// -------------------------------------------------------
public String getAppletInfo()
{
return "Name: KeyCode\r\n" +
"Author: Alexandr Frolov\r\n" +
"WWW: http://www.glasnet.ru/~frolov" +
"Author: Alexandr Frolov\r\n" +
"Created with Microsoft Visual J++ Version 1.0";
}
// -------------------------------------------------------
// init
// Метод, получающий управление при инициализации аплета
// -------------------------------------------------------
public void init()
{
// Получаем контекст отображения
Graphics g = getGraphics();
// Определяем метрики текущего шрифта
FontMetrics fm = g.getFontMetrics();
// Сохраняем полную высоту символов шрифта
yHeight = fm.getHeight();
}
// -------------------------------------------------------
// paint
// Метод paint, выполняющий рисование в окне аплета
// -------------------------------------------------------
public void paint(Graphics g)
{
// Определяем текущие размеры окна аплета
dimAppWndDimension = size();
// Выбираем в контекст отображения желтый цвет
g.setColor(Color.yellow);
// Закрашиваем внутреннюю область окна аплета
g.fillRect(0, 0,
dimAppWndDimension.width - 1,
dimAppWndDimension.height - 1);
// Выбираем в контекст отображения черный цвет
g.setColor(Color.black);
// Рисуем рамку вокруг окна аплета
g.drawRect(0, 0,
dimAppWndDimension.width - 1,
dimAppWndDimension.height - 1);
}
// -------------------------------------------------------
// keyDown
// Вызывается, когда пользователь нажимает на клавишу
// -------------------------------------------------------
public boolean keyDown(Event evt, int nKey)
{
// Массив для преобразования кода символа в сивол
char[] chKey;
// Временная строка
String s;
// Создаем массив из одного элемента
chKey = new char[1];
// Записыаем в него код нажатой клавиши
chKey[0] = (char)nKey;
// Преобразуем в строку
s = new String(chKey);
// Получаем контекст отображения
Graphics g = getGraphics();
// Выбираем черный цвет для рисования
g.setColor(Color.black);
// Рисуем символ, соответствующий нажатой клавише
g.drawString(s + " ", 10, 10);
// Рисуем код клавиши
g.drawString(
" -> key: " + evt.key, 20, 10);
// Рисуем код модификации
g.drawString(" mod: " + evt.modifiers, 100, 10);
return true;
}
// -------------------------------------------------------
// keyUp
// Вызывается, когда пользователь отпускает клавишу
// -------------------------------------------------------
public boolean keyUp(Event evt, int nKey)
{
// Получаем контекст отображения
Graphics g = getGraphics();
// Выполняем свертку нижней области окна
g.copyArea(0, 1,
dimAppWndDimension.width - 1,
dimAppWndDimension.height - yHeight - 5,
0, yHeight + 1);
// Закрашиваем область ввода желтым цветом
g.setColor(Color.yellow);
g.fillRect(1, 1,
dimAppWndDimension.width - 2, yHeight + 1);
return true;
}
}
В листинге 4.6 вы найдете исходный текст документа HTML, в который встроен наш аплет. Листинг 4.6. Файл KeyCode\KeyCode.html
<html>
<head>
<title>KeyCode</title>
</head>
<body>
<hr>
<applet
code=KeyCode.class
id=KeyCode
width=320
height=240 >
</applet>
<hr>
<a href="KeyCode.java">The source.</a>
</body>
</html>
Описание исходного текстаНаш аплет определяет несколько полей в своем классе и переопределяет несколько методов базового класса. Поля класса KeyCodeПоле yHeight используется для хранения полной высоты символов текущего шрифта, выбранного в контекст отображения окна аплета. Эта величина нужна для определения шага свертки окна. В поле dimAppWndDimension типа Dimension хранятся текущие размеры окна аплета. Метод getAppletInfoМетод getAppletInfo возвращает информацию об аплете и не имеет никаких особенностей. Метод initЭтот метод получает контекст отображения, однако не для рисования, а для определения метрик шрифта: Graphics g = getGraphics(); FontMetrics fm = g.getFontMetrics(); В переменную yHeight заносится полная высота символов текущего шрифта: yHeight = fm.getHeight(); Метод paintМетод paint закрашивает окно аплета желтым цветом и обводит его рамкой. Никакой другой работы этот метод не выполняет. Метод keyDownКогда пользователь нажимает клавишу, управление передается методу keyDown. Обработчик метода keyDown преобразует код нажатой клавиши nKey в текстовую строку типа String и затем отображает эту строку и содержимое двух полей объекта evt в окне аплета. Преобразование выполняется в два приема. Вначале код символа, имеющий тип int, преобразуется к типу char и записывается в ячейку массива типа char[], как это показано ниже: char[] chKey; String s; chKey = new char[1]; chKey[0] = (char)nKey; Затем этот массив, состоящий только из одного элемента, преобразуется в текстовую строку: s = new String(chKey); Далее метод ketDown получает контекст отображения, устанавливает в нем черный цвет и рисует в верхней части окна параметры клавиатурного события:
Graphics g = getGraphics();
g.setColor(Color.black);
g.drawString(s + " ", 10, 10);
g.drawString(" -> key: " + evt.key, 20, 10);
g.drawString(" mod: " + evt.modifiers, 100, 10);
Метод keyUpМетод keyUp получает управление, когда пользователь отпускает ранее нажатую клавишу. Ему передаются те же параметры, что и только что рассмотренному методу keyDown. Наш метод keyUp получает контекст отображения, а затем выполняет копирование верхней части окна, сдвигая ее вниз на размер символов текущего шрифта: g.copyArea(0, 1, dimAppWndDimension.width - 1, dimAppWndDimension.height - yHeight - 5, 0, yHeight + 1); После сдвига метод закрашивает область ввода, расположенную в верхней части аплета, желтым цветом, расчищая таким образом место для ввода новой строки: g.setColor(Color.yellow); g.fillRect(1, 1, dimAppWndDimension.width - 2, yHeight + 1); |


