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

Оглавление

Работа с панелями
Создание панелей
Добавление панелей
Добавление компонент
Рисование в панели
Класс на базе Panel
Аплет Options
Исходный текст
Описание текста

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

Назад Вперед

Помимо основного класса Options в нашем аплете создается еще три класса для панелей с именами FirstPanel, CardPanel и ControlPanel.

Класс FirstPanel соответствует самой верхней панели, в которой отображается строка текста First panel. Классы CardPanel и ControlPanel испльзуются для создания панелей со списками и управляющими кнопками, соответственно. Мы будем рассматривать эти классы по отдельности.

### Главный класс аплета Options

В главном классе аплета Options мы определили три поля с именами pPanel1, pCard и pControl:

    FirstPanel   pPanel1;
    CardPanel    pCard;
    ControlPanel pControl;

В них хранятся ссылки на три класса, созданных нами для трех панелей.

#### Метод init

Прежде всего метод init устанавливает для окна аплета режим размещения GridLayout:

    setLayout(new GridLayout(3, 1));

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

Панели создаются с помощью оператора new как объекты соответствующих классов, определенных в нашем приложении:

    pPanel1 = new FirstPanel();
    add(pPanel1);

    pCard = new CardPanel(pPanel1);
    add(pCard);

    pControl = new ControlPanel(pCard);
    add(pControl);

Для добавления панелей в окно аплета мы использовали метод add.

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

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

Обратите внимание, что мы вызываем методы setBackground и setForeground для объекта pPanel1.

После выполнения всех этих действий метод init перерисовывает окно аплета, вызывая метод repaint:

    repaint();

### Класс FirstPanel

Мы создали класс FirstPanel на базе класса Panel, определив в нем одно поле типа String и переопределив метод paint:

    class FirstPanel extends Panel
    {
      . . .
    }

Текстовое поле szFontName хранит название шрифта, с использованием которого в окне верхней панели отображается текстовая строка:

    String szFontName = "TimesRoman";

Метод paint определяет текущие размеры панели и рисует вокруг нее прямоугольную рамку:

    Dimension dimAppWndDimension = getSize();

    g.drawRect(0, 0,
      dimAppWndDimension.width  - 1,
      dimAppWndDimension.height - 1);

Далее метод paint выбирает в контекст отображения, связанный с панелью, шрифт с названием szFontName и рисует текстовую строку:

    g.setFont(new Font(szFontName,
        Font.PLAIN, 24));
    g.drawString("First panel", 10, 50);

Заметим, что сразу после запуска аплета рамка и строка будут нарисованы с использованием черного цвета, выбранного в контекст отображения панели по умолчанию. В дальнейшем вы можете изменить этот цвет при помощи соответствующей страницы блокнота, реализованного во второй панели.

Последнее действие, которое выполняет метод paint первой панели - вызов метода paint из родительского класса:

    super.paint(g);

Это приводит к перерисовке окна аплета.

### Класс CardPanel

С помощью класса CardPanel мы создали панель для блокнота, содержащего три страницы. Этот класс, так же как и предыдущий, создан на базе класса Panel.

#### Поля класса CardPanel

В полях pBgColor, pFgColor и pFont хранятся ссылки на панели страниц блокнота, которые мы разместим внутри панели класса CardPanel:

    Panel pBgColor;
    Panel pFgColor;
    Panel pFont;

Кроме того, в поле pControlled хранится ссылка на верхнюю панель с текстовой строкой First Panel.

    Panel pControlled;

Это поле будет проинициализировано конструктором класса CardPanel.

В следующих трех полях мы храним ссылки на списки класса Choice, предназначенные, соответственно, для выбора цвета текста, цвета фона и шрифта:

    Choice chBgColor;
    Choice chFgColor;
    Choice chFont;

Три поля класса Label содержат ссылки на подписи к указанным выше спискам:

    Label lbBgColor;
    Label lbFgColor;
    Label lbFont;

#### Конструктор класса CardPanel

При создании объекта класса CardPanel мы передаем конструктору ссылку на верхнюю панель, параметрами которой нужно управлять. Конструктор записывает эту ссылку в поле pControlled:

    public CardPanel(Panel pControlledPanel)
    {
      pControlled = pControlledPanel;
       . . .
    }

Затем конструктор устанавливает режим размещения CardLayout, оставляя зазор по вертикали и горизонтали, равный пяти пикселам:

    setLayout(new CardLayout(5, 5));

На следующем этапе мы создаем три панели для страниц блокнота и добавляем их в панель CardPanel, задавая имена:

    pBgColor = new Panel();
    pFgColor = new Panel();
    pFont    = new Panel();

    add("BgColor", pBgColor);
    add("FgColor", pFgColor);
    add("Font", pFont);

Теперь нам нужно создать и заполнить три списка, предназначенный для выбора цвета и шрифта. Эти списки создаются как объекты класса Choice:

    chBgColor = new Choice();
    chFgColor = new Choice();
    chFont    = new Choice();

После создания списки наполняются текстовыми строками. В каждый список мы добавляем по три строки:

    chBgColor.add("Yellow");
    chBgColor.add("Green");
    chBgColor.add("White");

    chFgColor.add("Black");
    chFgColor.add("Red");
    chFgColor.add("Green");

    chFont.add("TimesRoman");
    chFont.add("Helvetica");
    chFont.add("Courier");

Для того чтобы снабдить списки подписями, мы создаем три объекта класса Label:

    lbBgColor = new Label("Background color");
    lbFgColor = new Label("Foreground color");
    lbFont = new Label("Font");

Эти объекты, а также списки добавляются на свои страницы блокнота (то есть в свои панели):

    pBgColor.add(lbBgColor);
    pBgColor.add(chBgColor);

    pFgColor.add(lbFgColor);
    pFgColor.add(chFgColor);

    pFont.add(lbFont);
    pFont.add(chFont);

На этом работа метода init заканчивается.

#### Метод action

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

Вначале метод action проверяет, что событие вызвано списком класса Choice:

    if(evt.target instanceof Choice)
    {
      . . .
        return true;
      }
      return false;
    }

События, связанные с изменением цвета фона, обрабатываются следующим образом:

    ch = (Choice)evt.target;

    if(evt.target.equals(chBgColor))
    {
      if(ch.getSelectedIndex() == 0)
        pControlled.setBackground(
        Color.yellow);

      else if(ch.getSelectedIndex() == 1)
        pControlled.setBackground(
        Color.green);

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

Здесь метод setBackground вызывается для объекта, ссылка на который передана конструктору класса и записана в поле pControlled. Это ссылка на панель, размещенную в верхней части окна нашего аплета.

Аналогичным образом изменяется цвет текста и рамки для верхней панели:

    else if(evt.target.equals(chFgColor))
    {
      if(ch.getSelectedIndex() == 0)
        pControlled.setForeground(
        Color.black);

    else if(ch.getSelectedIndex() == 1)
        pControlled.setForeground(
        Color.red);

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

Для изменения шрифта мы устанавливаем новое значение переменной поля szFontName, определенной в классе FirstPanel:

    else if(evt.target.equals(chFont))
    {
      if(ch.getSelectedIndex() == 0)
        ((FirstPanel)pControlled).szFontName
         = "TimesRoman";

      else if(ch.getSelectedIndex() == 1)
        ((FirstPanel)pControlled).szFontName
         = "Helvetica";

      else if(ch.getSelectedIndex() == 2)
        ((FirstPanel)pControlled).szFontName
         = "Courier";
    }

Для того чтобы адресоваться к полю szFontName, нам пришлось выполнить явное преобразование типа ссылки pControlled.

Последнее действие, которое совершает метод action - это перерисовка окна верхней панели, которая выполняется с помощью метода repaint:

    pControlled.repaint();

### Класс ControlPanel

Класс ControlPanel создан для нижней панели с управляющими кнопками.

#### Поля класса ControlPanel

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

    Button btNext;
    Button btPrev;
    Button btBgColor;
    Button btFgColor;
    Button btFont;

Поле pCard хранит ссылку на панель блокнота:

    Panel pCard;

Эта ссылка инициализируется конструктором класса.

#### Конструктор класса ControlPanel

В задачу конструктора класса ControlPanel входит запоминание ссылки на панель блокнота, установка режима размещения компонент GridLayout, а также создание и добавление в нижнюю панель управляющих кнопок:

    public ControlPanel(Panel pCardPanel)
    {
      pCard = pCardPanel;
      setLayout(new GridLayout(2,3));

      btBgColor = new Button("Background Color");
      btFgColor = new Button("Foreground Color");
      btFont = new Button("Set Font");
      btNext = new Button("Next");
      btPrev = new Button("Prev");

      add(btBgColor);
      add(btFgColor);
      add(btFont);
      add(btNext);
      add(btPrev);
    }

Кнопки располагаются в ячейках таблицы, содержащей две строки и три столбца. В целом конструктор класса ControlPanel не имеет никаких интересных особенностей.

#### Метод action

Метод action управляет работой блокнота, отображая его страницы.

Когда пользователь нажимает на кнопки, выбирающие страницы блокнота, метод action выдвигает нужную страницу на передний план с помощью метода show:

    if(evt.target.equals(btBgColor))
    {
      ((CardLayout)pCard.getLayout()).show(
        pCard, "BgColor");
    }
    else if(evt.target.equals(btFgColor))
    {
      ((CardLayout)pCard.getLayout()).show(
      pCard, "FgColor");
    }
    else if(evt.target.equals(btFont))
    {
      ((CardLayout)pCard.getLayout()).show(
        pCard, "Font");
    }

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

Циклический перебор страниц блокнота выполняется с помощью методов next и previous, соответственно:

    else if(evt.target.equals(btNext))
    {
      ((CardLayout)pCard.getLayout()).next(
        pCard);
    }
    else if(evt.target.equals(btPrev))
    {
      ((CardLayout)pCard.getLayout()).
        previous(pCard);
    }

Назад Вперед

Java | Продукты и решения | Технологии | Сервис и обучение
О компании | Партнеры | Новости | Поиск