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

Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 1

© Александр Фролов, Григорий Фролов
Том 30, М.: Диалог-МИФИ, 1997, 288 стр.

[Назад] [Содеожание] [Дальше]

Приложение ButtonPress

В окне приложения ButtonPress мы создаем четыре кнопки с названиями от Button 1 до Button 4. Когда пользователь нажимает на одну из кнопок, название нажатой кнопки отображается в окне аплета и в строке состояния навигатора (рис. 5.3).

Рис. 5.3. Кнопки в окне аплета ButtonPress

Обратите внимание на расположение кнопок. По мере добавления, кнопки располагаются по горизонтали справа налево и центрируются в окне аплета. Если бы ширины окна аплета не хватило для размещения четырех кнопок, не поместившиеся кнопки были бы нарисованы ниже. Такую стратегию размещения выбирает по умолчанию система Layout Manager класса Panel, от которого, как вы знаете, произошел класс Applet.

Исходные тексты приложения ButtonPress

Исходный текст приложения ButtonPress приведен в листинге 5.1.

Листинг 5.1. Файл ButtonPress\ButtonPress.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 ButtonPress extends Applet
{
  // Создаем четыре ссылки на объекты типа Button
  Button btn1;
  Button btn2;
  Button btn3;
  Button btn4;

  // Строка для записи названия нажатой кнопки
  String sTextLabel;

  // -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающий строку информации об аплете
  // -------------------------------------------------------
  public String getAppletInfo()
  {
    return "Name: ButtonPress\r\n" +
      "E-mail: frolov@glas.apc.org" +
      "WWW:    http://www.glasnet.ru/~frolov" +
      "Author: Alexandr Frolov\r\n" +
      "Created with Microsoft Visual J++ Version 1.0";
  }

  // -------------------------------------------------------
  // init
  // Метод, получающий управление при инициализации аплета
  // -------------------------------------------------------
  public void init()
  {
    // Создаем четыре кнопки
    btn1 = new Button("Button 1");
    btn2 = new Button("Button 2");
    btn3 = new Button("Button 3");
    btn4 = new Button("Button 4");

    // Добавляем кнопки в контейнер, которым является
    // окно аплета
    add(btn1);
    add(btn2);
    add(btn3);
    add(btn4);

    // Название кнопки, нажатой в последний раз
    sTextLabel = new String("");
  }

  // -------------------------------------------------------
  // action
  // Метод вызывается, когда пользователь выполняет
  // действие над компонентами
  // -------------------------------------------------------
  public boolean action(Event evt, Object obj)
  {
    // Ссылка на кнопку, от которой пришло сообщение
    Button btn;

    // Проверяем, что событие вызвано кнопкой, а не
    // другим компонентом
    if(evt.target instanceof Button)
    {
      // Получам ссылку на кнопку, вызвавшую событие
      btn = (Button)evt.target;

      // Получаем название кнопки
      sTextLabel = btn.getLabel();

      // Выполняем ветвление по кнопкам. Для каждой кнопки
      // записываем ее название 
      // в строку состояния навигатора
      if(evt.target.equals(btn1))
      {
        showStatus(
          "Button 1 (\"" + sTextLabel + "\") pressed");
      }

      else if(evt.target.equals(btn2))
      {
        showStatus(
          "Button 2 (\"" + sTextLabel + "\") pressed");
      }

      else if(evt.target.equals(btn3))
      {
        showStatus(
           "Button 3 (\"" + sTextLabel + "\") pressed");
      }
      
      else if(evt.target.equals(btn4))
      {
        showStatus(
           "Button 4 (\"" + sTextLabel + "\") pressed");
      }

      // Если событие возникло от неизвестной кнопки,
      // мы его не обрабатываем
      else
      {
        return false;
      }

      // Перерисовываем окно аплета
      repaint();

      // возвращаем признак того, что мы обработали событие
      return true;
    }

    // Если событие вызвано не кнопкой, 
    // мы его не обрабатываем
    return false;
  }
      
  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
  public void paint(Graphics g)
  {
    // Определяем текущие размеры окна аплета
    Dimension 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);

    // Рисуем название нажатой кнопки
    g.drawString("Button (\"" + sTextLabel + "\") pressed",
      10, 70);
  }
}

Исходный текст документа HTML, созданный для аплета ButtonPress, представлен в листинге 5.2.

Листинг 5.2. Файл ButtonPress\ButtonPress.html


<html>
<head>
<title>ButtonPress</title>
</head>
<body>
<hr>
<applet
    code=ButtonPress.class
    id=ButtonPress
    width=320
    height=240 >
</applet>
<hr>
<a href="ButtonPress.java">The source.</a>
</body>
</html>

Описание исходного текста

После того как исходный текст приложения был создан системой Java Applet Wizard, мы добавили поля для хранения ссылок на кнопки и текстовую строку для записи метки нажатой кнопки, а также добавили и изменили несколько методов.

Поля класса ButtonPress

Четыре поля класса Button с именами btn1, btn2, btn3 и btn4 предназначены для хранения ссылок на кнопки, размещенные в окне нашего аплета:


Button btn1;
Button btn2;
Button btn3;
Button btn4;

В поле sTextLabel класса String хранится строка, предназначенная для записи названия нажатой кнопки:


String sTextLabel;

Метод getAppletInfo

Метод getAppletInfo, возвращающий строку информации об аплете, не имеет никаких особенностей.

Метод init

При инициализации аплета метод init создает четыре кнопки, сохраняя ссылки на них в соответствующих полях нашего класса, а также добавляет эти кнопки в окно аплета, вызывая для этого метод add:


public void init()
{
  btn1 = new Button("Button 1");
  btn2 = new Button("Button 2");
  btn3 = new Button("Button 3");
  btn4 = new Button("Button 4");

  add(btn1);
  add(btn2);
  add(btn3);
  add(btn4);

  sTextLabel = new String("");
}

После добавления кнопок в строку sTextLabel записывается пустое значение, так как ни одна кнопка еще не была нажата.

Метод action

Метод action проверяет, является ли объект, создавший событие, кнопкой. Для этого он сравнивает ссылку на объект, передаваемую через поле evt.target, с объектом Button, пользуясь оператором instanceof. Так как поле evt.target может содержать ссылку на любой объект, способный создавать события, а не только на объект типа Button, эта проверка необходима для исключения ложных срабатываний на чужие события.

Если событие создано кнопкой, ссылка на эту кнопку сохраняется в переменной btn:


Button btn;
btn = (Button)evt.target;

При этом мы выполняем преобразование типов.

Далее метод action получает название кнопки (то есть строку, написанную на поверхности кнопки) и сохраняет его в переменной sTextLabel:


sTextLabel = btn.getLabel();

Для получения строки названия кнопки используется метод getLabel, определенный в классе Button.

Затем метод action проверяет, от какой конкретно кнопки пришло событие, выполняя ветвление с помощью оператора if - else if - else:


if(evt.target.equals(btn1))
{
  showStatus("Button 1 (\"" + sTextLabel + "\") pressed");
}

else if(evt.target.equals(btn2))
{
  showStatus("Button 2 (\"" + sTextLabel + "\") pressed");
}
. . .
else
{
  return false;
}

Название нажатой кнопки отображается в строке состояния навигатора. Если событие создано кнопкой, обработчик которой не предусмотрен в нашем методе action, метод просто возвращает значение false, отказываясь таким образом от обработки события.

Если ваша реализация метода action не обрабатывает событие, она может передать его методу action базового класса, как это показано ниже:


super.action(evt, obj); 

В том случае, когда событие было обработано, метод action перерисовывает окно аплета, вызывая метод repaint, и затем возвращает значение true:


repaint();
return true;

Метод paint

Метод paint не содержит никакого кода для рисования кнопок, так как эта задача решается в рамках класса Button. После раскрашивания фона окна аплета и рисования рамки вокруг него, метод paint пишет название нажатой кнопки в окне аплета с помощью метода drawString:


g.drawString("Button (\"" + sTextLabel + "\") pressed",
  10, 70);
[Назад] [Содеожание] [Дальше]