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

Оглавление Работа с панелями Создание панелей Добавление панелей Добавление компонент Рисование в панели Класс на базе Panel Аплет 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);
    }

Назад Вперед