Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

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);
[Назад] [Содеожание] [Дальше]