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); |