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

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

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

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

Приложение CheckBoxes

Для демонстрации методов работы с различными переключателями мы подготовили приложение CheckBoxes. Окно соответствующего аплета показано на рис. 5.4.

Рис. 5.4. Окно аплета CheckBoxes с переключателями и кнопкой

В верхней части окна располагаются четыре переключателя с зависимой фиксацией, принадлежащих к одной группе. Ниже находятся три переключателя с независимой фиксацией, а еще ниже - кнопка с надписью Get CheckBoxes state. Нажав на эту кнопку, вы можете увидеть в нижней части окна аплета список включенных переключателей.

Одновременно может быть включен только один из переключателей Mode 1 - Mode 4, так как эти переключатели составляют группу переключателей с зависимой фиксацией. Переключатели Switch 1, Switch 2 и Switch 3 могут находиться в произвольном состоянии независимо друг от друга.

Заметим, что переключатели и кнопка размещались в окне аплета автоматически по мере добавления. Если бы мы добавляли эти компоненты в другой последовательности или если бы окно аплета имело другие размеры, то переключатели могли бы не оказаться сгруппированными, как это показано на рис. 5.4. Позже в этой главе мы научим вас настраивать систему Layout Manager таким образом, чтобы вы смогли располагать компоненты в заданном вами порядке с предсказуемым результатом.

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

Файл исходного текста приложения CheckBoxes представлен в листинге 5.3.

Листинг 5.3. Файл CheckBoxes\CheckBoxes.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 CheckBoxes extends Applet
{
  // Создаем три ссылки на объекты типа Checkbox
  Checkbox chbox1;
  Checkbox chbox2;
  Checkbox chbox3;
  
  // Создаем ссылку на объект типа CheckboxGroup
  CheckboxGroup grModeGroup;

  // Создаем четыре ссылки на объекты типа Checkbox
  Checkbox rdbox1;
  Checkbox rdbox2;
  Checkbox rdbox3;
  Checkbox rdbox4;

  // Создаем ссылку на объект типа Button
  Button btnGet;

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

  // -------------------------------------------------------
  // init
  // Метод, получающий управление при инициализации аплета
  // -------------------------------------------------------
  public void init()
  {
    // Устанавливаем желтый цвет фона
    setBackground(Color.yellow);
    
    // Создаем три переключателя с независимой фиксацией
    chbox1 = new Checkbox("Switch 1");
    chbox2 = new Checkbox("Switch 2");
    chbox3 = new Checkbox("Switch 3");
    
    // Создаем группу переключателей с зависимой фиксацией
    grModeGroup = new CheckboxGroup();
    
    // Создаем четыре переключателя с зависимой фиксацией,
    // принадлежащие группе grModeGroup
    rdbox1 = new Checkbox("Mode 1",grModeGroup, true);
    rdbox2 = new Checkbox("Mode 2",grModeGroup, false);
    rdbox3 = new Checkbox("Mode 3",grModeGroup, false);
    rdbox4 = new Checkbox("Mode 4",grModeGroup, false);

    // Создаем кнопку, предназначенную для определения
    // текущего состояния переключателей
    btnGet = new Button("Get CheckBoxes state");

    // Добавляем в окно аплета четыре переключателя
    // с зависимой фиксацией
    add(rdbox1);
    add(rdbox2);
    add(rdbox3);
    add(rdbox4);

    // Добавляем в окно аплета три переключателя
    // с независимой фиксацией
    add(chbox1);
    add(chbox2);
    add(chbox3);

    // Добавляем в окно аплета кнопку
    add(btnGet);
  }

  // -------------------------------------------------------
  // action
  // Метод вызывается, когда пользователь выполняет
  // действие над компонентами
  // -------------------------------------------------------
  public boolean action(Event evt, Object obj)
  {
    // Проверяем, что событие вызвано кнопкой, а не
    // другим компонентом
    if(evt.target instanceof Button)
    {
      // Выполняем ветвление по кнопкам. 
      if(evt.target.equals(btnGet))
      {
        showStatus("Button 1 pressed");
      }

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

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

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

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

  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
  public void paint(Graphics g)
  {
    // Определяем текущие размеры окна аплета
    Dimension dimAppWndDimension = size();
    
    // Выбираем в контекст отображения черный цвет
    g.setColor(Color.black);

    // Рисуем рамку вокруг окна аплета
    g.drawRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    // Строка для записи списка 
    // состояния переключателей
    String s = new String("> ");

    // Проверяем переключатели с независимой фиксацией
    if(chbox1.getState())
      s = s + chbox1.getLabel() + ", ";
    
    if(chbox2.getState())
      s = s + chbox2.getLabel() + ", ";
    
    if(chbox3.getState())
      s = s + chbox3.getLabel() + ", ";
    
    if(rdbox1.getState())
      s = s + rdbox1.getLabel();

    // Проверяем переключатели с зависимой фиксацией
    else if(rdbox2.getState())
      s = s + rdbox2.getLabel();

    else if(rdbox3.getState())
      s = s + rdbox3.getLabel();

    else if(rdbox4.getState())
      s = s + rdbox4.getLabel();

    // Рисуем строку состояния переключателей
    g.drawString(s, 10, 150);
  }
}

В листинге 5.4 вы найдете исходный текст документа HTML, который был создан системой Java Applet Wizard для нашего аплета.

Листинг 5.4. Файл CheckBoxes\CheckBoxes.html


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

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

Рассмотрим поля класса CheckBoxes и переопределенные нами методы.

Поля класса CheckBoxes

В нашем классе мы определили несколько полей, предназначенных для хранения ссылок на переключатели, группу переключателей и кнопку.

Ссылки на переключатели имеют тип Checkbox:


Checkbox chbox1;
Checkbox chbox2;
Checkbox chbox3;

Checkbox rdbox1;
Checkbox rdbox2;
Checkbox rdbox3;
Checkbox rdbox4;

Для того чтобы сгруппировать переключатели с зависимой фиксацией в группу, мы создали ссылку на объект класса CheckboxGroup:


CheckboxGroup grModeGroup;

Кроме того, нам потребуется ссылка на объект класса Button:


Button btnGet;

Метод getAppletInfo

Метод getAppletInfo возвращает информацию о нашем аплете.

Метод init

До сих пор для изменения цвета фона окна наших аплетов мы раскрашивали окно в желтый цвет явным образом в методе paint. Однако есть и другой способ, основанный на вызове метода setBackground:


setBackground(Color.yellow);

Дополнением к этому методу может послужить метод setForeground, с помощью которого можно установить цвет для рисования в окне.

Почему мы выбрали другой способ изменения фона окна?

Дело в том, что переключатели сами по себе являются окнами, обладающими такими атрибутами, как цвет фона и цвет изображения. Если просто нарисовать их в окне, закрашенным желтым цветом, то получится, что серые переключатели нарисованы на желтом фоне, что некрасиво. Метод setBackground, вызванный для окна аплета, позволяет задать цвет фона не только для контейнера, но и для всех компонент, расположенных в нем.

После установки цвета фона метод init создает три переключателя с независимой фиксацией, указывая их название:


chbox1 = new Checkbox("Switch 1");
chbox2 = new Checkbox("Switch 2");
chbox3 = new Checkbox("Switch 3");

Далее метод init создает группу переключателей с зависимой фиксацией в виде объекта класса CheckboxGroup:


grModeGroup = new CheckboxGroup();

Для создания переключателей с зависимой фиксацией необходимо использовать метод, допускающий указание группы и начального состояния переключателя:


rdbox1 = new Checkbox("Mode 1",grModeGroup, true);
rdbox2 = new Checkbox("Mode 2",grModeGroup, false);
rdbox3 = new Checkbox("Mode 3",grModeGroup, false);
rdbox4 = new Checkbox("Mode 4",grModeGroup, false);

Затем метод init создает кнопку с названием Get CheckBoxes state, предназначенную для определения текущего состояния переключателей:


btnGet = new Button("Get CheckBoxes state");

После создания компонент они добавляются в контейнер, которым является окно аплета. Для этого используется метод add.

Прежде всего мы добавляем четыре переключателя с зависимой фиксацией:


add(rdbox1);
add(rdbox2);
add(rdbox3);
add(rdbox4);

Размеры окна и размеры переключателей соотносятся между собой таким образом, что в верхней части окна аплета помещаются как раз четыре переключателя. Очевидно, если изменить размеры окна аплета, переключатели будут размещены по-другому.

Далее метод init добавляет в окно аплета переключатели с независимой фиксацией и кнопку:


add(chbox1);
add(chbox2);
add(chbox3);
add(btnGet);

Метод action

Метод action обрабатывает только те события, которые вызваны кнопкой btnGet:


if(evt.target instanceof Button)
{
  if(evt.target.equals(btnGet))
    showStatus("Button 1 pressed");
  else
    return false;
  repaint();
  return true;
}

Когда пользователь нажимает кнопку, метод action выводит сообщение об этом в строку состояния навигатора и перерисывавает окно аплета. Текущее состояние кнопок определяется методом paint во время перерисовки окна.

Метод paint

В методе paint мы не закрашиваем желтым цветом окно аплета, так как на этапе инициализации в обработчике метода init был установлен желтый цвет фона окна. Однако черную рамку вокруг границы окна аплета мы все же рисуем.

Основная задача метода paint заключается в отображении в нижней части окна аплета списка включенных переключателей. Для формирования этой строки мы создаем объект s класса String:


String s = new String("> ");

Далее мы проверяем по очереди состояние всех переключателей с независимой фиксацией, дописывая к строке s название включенных переключателей:


if(chbox1.getState())
  s = s + chbox1.getLabel() + ", ";
if(chbox2.getState())
  s = s + chbox2.getLabel() + ", ";
if(chbox3.getState())
  s = s + chbox3.getLabel() + ", ";

Для определения текущего состояния переключателей мы вызываем метод getState. Этот метод возвращает значение true для включенного переключателя и false - для выключенного. Название переключателя легко определить с помощью метода getLabel.

Проверка состояний переключателей с зависимой фиксацией выполняется аналогично, но с учетом того, что одновременно может быть включен только один такой пеерключатель:


if(rdbox1.getState())
  s = s + rdbox1.getLabel();
else if(rdbox2.getState())
  s = s + rdbox2.getLabel();
else if(rdbox3.getState())
  s = s + rdbox3.getLabel();
else if(rdbox4.getState())
  s = s + rdbox4.getLabel();

После завершения формирования строки s она отображается в окне аплета методом drawString:


g.drawString(s, 10, 150);
[Назад] [Содеожание] [Дальше]