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

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

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

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

Приложение ChoiceList

В прложении ChoiceList мы создали два списка, первый из которых управляет цветом фона окна аплета, а второй - цветом изображения, то есть цветом, которым рисуется изображение в этом окне (рис. 5.7).

Рис. 5.7. Окно аплета ChoiceList, в котором создано два списка класса Choice

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

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

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

Листинг 5.5. Файл ChoiceList\ChoiceList.java


// =========================================================
// Списки типа Drop Down
//
// (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 ChoiceList extends Applet
{
  // Создаем ссылки на объекты класса Choice
  Choice chBackgroundColor;
  Choice chForegroundColor;

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

  // -------------------------------------------------------
  // init
  // Метод, получающий управление при инициализации аплета
  // -------------------------------------------------------
  public void init()
  {
    // Создаем списки для выбора цвета фона и
    // цвета изображения
    chBackgroundColor = new Choice();
    chForegroundColor = new Choice();

    // Добавляем списки в окно аплета
    add(chBackgroundColor);
    add(chForegroundColor);

    // Заполняем список цвета фона
    chBackgroundColor.addItem("Yellow");
    chBackgroundColor.addItem("Green");
    chBackgroundColor.addItem("White");

    // Заполняем список цвета изображения
    chForegroundColor.addItem("Black");
    chForegroundColor.addItem("Red");
    chForegroundColor.addItem("Blue");

    // Устанавливаем цвет фона
    setBackground(Color.yellow);

    // Устанавливаем цвет изображения
    setForeground(Color.black);
  }

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

    // Получаем ссылку на список
    ch = (Choice)evt.target;

    // Проверяем, что событие вызвано списком, а не
    // другим компонентом
    if(evt.target instanceof Choice)
    {
      // Выполняем ветвление по спискам
      
      // Список цвета фона
      if(evt.target.equals(chBackgroundColor))
      {
        // Получаем номер текущего элемента списка
        // и устанавливаем соответствующий
        // цвет фона
        if(ch.getSelectedIndex() == 0)
          setBackground(Color.yellow);
        
        else if(ch.getSelectedIndex() == 1)
          setBackground(Color.green);

        else if(ch.getSelectedIndex() == 2)
          setBackground(Color.white);
      }

      // Список цвета изображения
      else if(evt.target.equals(chForegroundColor))
      {
        // Получаем номер текущего элемента списка
        // и устанавливаем соответствующий
        // цвет изображения
        if(ch.getSelectedIndex() == 0)
          setForeground(Color.black);
        
        else if(ch.getSelectedIndex() == 1)
          setForeground(Color.red);

        else if(ch.getSelectedIndex() == 2)
          setForeground(Color.blue);
      }

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

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

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

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

  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
  public void paint(Graphics g)
  {
    // Определяем текущие размеры окна аплета
    Dimension dimAppWndDimension = size();
    
    // Рисуем рамку вокруг окна аплета
    g.drawRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    // Рисуем строку
    g.drawString("Смотри на цвет фона и текста!", 10, 50);
  }
}

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

Листинг 5.6. Файл ChoiceList\ChoiceList.html


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

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

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

Поля класса ChoiceList

В нашем классе мы определили два поля для хранения ссылок на списки цвета фона и цвета изображения:


Choice chBackgroundColor;
Choice chForegroundColor;

Метод getAppletInfo

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

Метод init

В методе init мы создаем два списка как объекты класса Choice:

chBackgroundColor = new Choice(); chForegroundColor = new Choice();

Созданные списки пока пустые, но мы можем добавить их в окно аплета, вызвав метод add:


add(chBackgroundColor);
add(chForegroundColor);

Сразу после добавления списков мы их заполняем, вызывая для соответствующих объектов метод addItem:


chBackgroundColor.addItem("Yellow");
chBackgroundColor.addItem("Green");
chBackgroundColor.addItem("White");

chForegroundColor.addItem("Black");
chForegroundColor.addItem("Red");
chForegroundColor.addItem("Blue");

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

Такие же цвета мы устанавливаем для окна аплета, вызывая методы setBackground и setForeground:


setBackground(Color.yellow);
setForeground(Color.black);

Метод action

Метод action обрабатывает событие, вызванное списками, - выбор элемента из списка.

Прежде всего, метод action сохраняет ссылку на список, в котором произошел выбор, в переменной ch:


Choice ch;
ch = (Choice)evt.target;

Далее выполняется проверка факта, что событие вызванно именно списком, после чего происходит анализ, в каком именно списке сделан выбор нового элемента:


if(evt.target.equals(chBackgroundColor))
{
  if(ch.getSelectedIndex() == 0)
    setBackground(Color.yellow);
  else if(ch.getSelectedIndex() == 1)
    setBackground(Color.green);
  else if(ch.getSelectedIndex() == 2)
    setBackground(Color.white);
}
else if(evt.target.equals(chForegroundColor))
{
  if(ch.getSelectedIndex() == 0)
    setForeground(Color.black);
  else if(ch.getSelectedIndex() == 1)
    setForeground(Color.red);
  else if(ch.getSelectedIndex() == 2)
    setForeground(Color.blue);
}
else
  return false;

Обратите внимание, что мы вначале выполняем преобразование типа evt.target к классу Choice, а только затем проверяем, действительно ли событие вызвано списком. Правильно ли это?

Вообще говоря, неправильно. Так как в поле evt.target могут находиться ссылки на объекты различных классов, в процессе выполнения преобразования типов может произойти исключение. Если предпринимается попытка выполнить преобразование для несовместимых типов. Но так как в нашем аплете события создаются только списками, исключение не возникает.

Корректнее было бы вначале проверить ссылку evt.target на принаддлежность к классу Choice с помощью оператора instanceof, а только потом выполнять преобразование типов. Так мы и будем делать в следующих примерах аплетов, обрабатывающих события от различных источников.

С помощью метода getSelectedIndex метод action определяет номер выбранного элемента списка, устанавливая соответствующим образом цвет фона или изображения.

Метод paint

Обработчик метода paint рисует рамку вокруг окна аплета и текстовую строку в средней части этого окна.


Dimension dimAppWndDimension = size();
g.drawRect(0, 0, 
  dimAppWndDimension.width  - 1, 
  dimAppWndDimension.height - 1);
g.drawString("Смотри на цвет фона и текста!", 10, 50);

При этом мы не указали цвет фона, а также цвет изображения. При этом используются цвета, установленные методом action при выборе соответствующих строк из списков.

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