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

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

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

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

Приложение PanelDemo

В приложении PanelDemo мы создаем две панели, расположенные горизонтально. Первая из них используется как блокнот, на каждой странице которого находится кнопка, вторая содержит две управляющие кнопки, позволяющие перебирать страницы блокнота по очереди (рис. 7.2).

Рис. 7.2. Окно аплета PanelDemo

Объемное изображение схемы расположения панелей и кнопок относительно окна аплета показано на рис. 7.3.

Рис. 7.3. Объемное изображение схемы расположения панелей и кнопок

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

Нажимая на кнопки Next и Prev, попробуйте понажимать на кнопки в верхней панели. В строке состояния навигатора при этом будет отображаться название нажатой кнопки (на рис. 6.5 это не показано).

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

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

Листинг 7.1. Файл PanelDemo\PanelDemo.java


// =========================================================
// Работа с панелями класса Panel
//
// (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 PanelDemo extends Applet
{
  // Панель для размещения блокнота
  Panel pCardPanel;

  // Панель для размещения кнопок управления блокнотом
  Panel pButtonPanel;
  
  // Создаем ссылки на объекты типа Button
  Button btn1;
  Button btn2;
  Button btn3;
  Button btn4;
  Button btn5;
  Button btnNext;
  Button btnPrev;

  // Строка для записи названия нажатой кнопки
  String sTextLabel;
	
  // -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
  public String getAppletInfo()
  {
    return "Name: Grid\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.1";
  }

  // -------------------------------------------------------
  // init
  // Метод, получающий управление при инициализации аплета
  // -------------------------------------------------------
  public void init()
  {
    // Устанавливаем желтый цвет фона
    setBackground(Color.yellow);

    // Создаем в окне аплета две панели, разделяющие
    // окно по горизонтали. В верхней панели будет 
    // находиться блокнот, 
    // в нижней - кнопки управления блокнотом
    setLayout(new GridLayout(2, 1));
       
    // Создаем кнопки блокнота
    btn1 = new Button("Button 1");
    btn2 = new Button("Button 2");
    btn3 = new Button("Button 3");
    btn4 = new Button("Button 4");
    btn5 = new Button("Button 5");

    // Создаем панель блокнота
    pCardPanel = new Panel();

    // Устанавливаем режим размещения для блокнота
    pCardPanel.setLayout(new CardLayout(5, 5));
    
    // Добавляем кнопки в блокнот
    pCardPanel.add(btn1);
    pCardPanel.add(btn2);
    pCardPanel.add(btn3);
    pCardPanel.add(btn4);
    pCardPanel.add(btn5);

    // Добавляем панель блокнота в окно аплета
    add(pCardPanel);

    // Создаем кнопки управления блокнотом

    // Кнопка просмотра следующей страницы блокнота
    btnNext = new Button("Next");

    // Кнопка просмотра предыдущей страницы блокнота
    btnPrev = new Button("Prev");

    // Создаем панель кнопок управления блокнотом
    pButtonPanel = new Panel();

    // Устанавливаем режим размещения для панели кнопок
    pButtonPanel.setLayout(new FlowLayout());

    // Добавляем кнопки в панель кнопок
    pButtonPanel.add(btnNext);
    pButtonPanel.add(btnPrev);

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

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

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

      // Записываем название кнопки 
      // в строку состояния навигатора
      showStatus("Button (\"" + sTextLabel + "\") pressed");

      // Выполняем ветвление по кнопкам. Для каждой кнопки
      // записываем ее название 
      // в строку состояния навигатора
      if(evt.target.equals(btnNext))
      {
        // Выбираем следующую страницу в блокноте
  ((CardLayout)pCardPanel.getLayout()).next(pCardPanel);
      }

      else if(evt.target.equals(btnPrev))
      {
        // Выбираем предыдущую страницу в блокноте
  ((CardLayout)pCardPanel.getLayout()).previous(pCardPanel);
      }

      else 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;
      }

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

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

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

Листинг 7.2. Файл PanelDemo\PanelDemo.html


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

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

Приведем описание полей и методов, определенных в нашем аплете.

Поля класса PanelDemo

В поле pCardPanel хранится ссылка на панель блокнота, страницы которого содержать кнопки. Эта панель располагается в верхней части окна аплета.

Поле pButtonPanel предназначено для хранения ссылки на панель кнопок, предназначенных для перелистывания страниц блокнота pCardPanel.

Ссылки на кнопки, расположенные на страницах блокнота, хранятся в полях btn1, btn2, btn3, btn4 и btn5.

Ссылки на кнопки, предназначенные для перелистывания страниц блокнота, записываются в поля btnNext и btnPrev (соответственно, кнопка пролистывания блокнота в прямом и обратном направлении).

В поле sTextLabel хранится название нажатой кнопки. Это название отображается в строке состояния навигатора, когда пользователь нажимает какую-либо кнопку в верхней или нижней панели.

Метод getAppletInfo

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

Метод init

Метод init создает все необходимые панели и добавляет в них компоненты.

В самом начале своей работы метод init устанавливает желтый цвет фона для окна аплета:


setBackground(Color.yellow);

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


setLayout(new GridLayout(2, 1));

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

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


btn1 = new Button("Button 1");
btn2 = new Button("Button 2");
btn3 = new Button("Button 3");
btn4 = new Button("Button 4");
btn5 = new Button("Button 5");

После создания кнопок метод init приступает к созданию и заполнению панели блокнота. Панель создается при помощи конструктора класса Panel:


pCardPanel = new Panel();

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


pCardPanel.setLayout(new CardLayout(5, 5));

После установки режима добавления можно заполнять блокнот кнопками:


pCardPanel.add(btn1);
pCardPanel.add(btn2);
pCardPanel.add(btn3);
pCardPanel.add(btn4);
pCardPanel.add(btn5);

Здесь мы воспользовались известным вам методом add, вызвав его для объекта pCardPanel.

Заполненная панель блокнота при помощи все того же метода add добавляется в окно аплета:


add(pCardPanel);

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

Завершив с панелью блокнота, метод init приступает к формированию панели управляющих кнопок.

Вначале метод создает сами управляющие кнопки:


btnNext = new Button("Next");
btnPrev = new Button("Prev");

Первая из них перелистывает страницы блокнота в прямом направлении, а вторая - в обратном.

Затем создается панель кнопок:


pButtonPanel = new Panel();

Для панели кнопок мы выбираем режим выравнивания FlowLayout, при котором компоненты добавляются слева направо и сверху вниз:


pButtonPanel.setLayout(new FlowLayout());

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


pButtonPanel.add(btnNext);
pButtonPanel.add(btnPrev);

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


add(pButtonPanel);

Данная панель добавляется в окно аплета второй по счету, поэтому она будет расположена в нижней половине этого окна.

Метод action

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

Вначале метод проверяет, что событие создано кнопкой. Далее идентификатор кнопки, вызвавшей событие, записывается в переменную btn:


btn = (Button)evt.target;

После этого метод action получает название кнопки, сохраняет его в строке sTextLabel, а затем отображает в строке состояния навигатора:


sTextLabel = btn.getLabel();
showStatus("Button (\"" + sTextLabel + "\") pressed");

Далее анализируется ссылка на кнопку. Если была нажата одна из управляющих кнопок, происходит перелистывание страниц блокнота, в прямом или обратном направлении:


if(evt.target.equals(btnNext))
{
  ((CardLayout)pCardPanel.getLayout()).next(pCardPanel);
}
else if(evt.target.equals(btnPrev))
{
  ((CardLayout)pCardPanel.getLayout()).previous(pCardPanel);
}

Здесь мы с помощью метода getLayout получаем ссылку на интерфейс системы Layout Manager, установленной для панели pCardPanel, а затем, пользуясь полученной ссылкой, вызываем методы next или previous. Обратите также внимание на необходимость явного приведения типа к классу CardLayout, в котором определены указанные методы.

Обработка событий, создаваемых кнопками, которые расположены на страницах блокнота, не имеет никаких особенностей:


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

Название кнопки просто отображается в строке состояния навигатора.

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