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

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

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

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

Приложение Inspector

Аплет Inspector располагается в одном документе HTML с приложениями Audio и Rectangles, которые уже были описаны в нашей книге (рис. 6.1).

Рис. 6.1. Документ HTML, в котором расположены три аплета - Inspector, Audio и Rectangles

В верхней части окна аплета Inspector расположены кнопки, дублирующие одноименные кнопки аплета Audio. С их помощью можно заставить аплет Audio проигрывать файл в однократном режиме или в цикле, а также остановить проигрывание.

В нижней части аплета Inspector отображается список имен аплетов, найденных в текущем документе HTML. Для списка используются первые строки описаний аплетов, полученные методом getAppletInfo.

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

Основной файл исходных текстов вы найдете в листинге 6.1.

Листинг 6.1. Файл Inspector\Inspector.java


// =========================================================
// Аплет, который получает список всех аплетов
// и управляет аплетом Audio
//
// (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.*;
import java.util.*;

// Импортируем класс Audio, так как нам нужен доступ к 
// его полям
import Audio;

public class Inspector extends Applet
{
  // Контекст аплетов
  AppletContext appContext;

  // Список аплетов, расположенных в документе HTML
  Enumeration eApplets;

  // Ссылка на аплет Audio
  Audio appAudio = null;

  // Кнопка для однократного проигрывания
  Button btPlay;

  // Кнопка для проигрывания в цикле
  Button btLoop;

  // Кнопка для остановки проигрывания
  Button btStop;

  // -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
  public String getAppletInfo()
  {
    return "Name: Inspector\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()
  {
      // Создаем кнопку для однократного проигрывания
    btPlay = new Button("Play");

    // Создаем кнопку для проигрывания в цикле
    btLoop = new Button("Loop");

    // Создаем кнопку для остановки проигрывания
    btStop = new Button("Stop");

    // Блокируем эту кнопку, так как пока еще
    // проигрывание не запущено
    btStop.disable();

    // Добавляем кнопки в окно аплета
    add(btPlay);
    add(btLoop);
    add(btStop);
  }
  
  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
  public void paint(Graphics g)
  {
    // Определяем текущие размеры окна аплета
    Dimension dimAppWndDimension = size();
    
    // Выбираем в контекст отображения желтый цвет
    g.setColor(Color.yellow);
    
    // Закрашиваем внутреннюю область окна аплета
    g.fillRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    // Выбираем в контекст отображения черный цвет
    g.setColor(Color.black);

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

    // Получаем контекст аплетов
    appContext = getAppletContext();
    
    // Получаем список всех аплетов в документе HTML
    eApplets = appContext.getApplets();

    // Сбрасываем счетчик цикла
    int i = 0;
    
    // Цикл по аплетам
    while(eApplets.hasMoreElements())
    {
      // Имя текущего аплета
      String appName;
      
      // Получаем ссылку на очередной аплет
      Applet currentApplet = 
        (Applet)(eApplets.nextElement());

      // Получаем строку информации об аплете
      appName = currentApplet.getAppletInfo();

      // Обрезаем строку, удаляя символ конца строки
      StringTokenizer st;
      st   = new StringTokenizer(appName, "\r\n");
      appName = new String((String)st.nextElement());
      
      // Отображаем имя найденного аплета
      g.drawString(appName , 10, 15 * i + 50);

      // Если нашли аплет Audio, запоминаем ссылку
      // на него в поле appAudio
      if(appName.equals("Name: Audio"))
      {
        appAudio = (Audio)currentApplet;
      }

      // Увеличиваем счетчик аплетов
      i++;
    }
  }

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

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

      // Выполняем ветвление по кнопкам
      
      // Нажата кнопка однократного проигрывания
      if(evt.target.equals(btPlay))
      {
        // Запускаем однократное проигрывание
        appAudio.auClip.play();

        // Разблокируем кнопку остановки проигрывания
        btStop.enable();
      }

      // Нажата кнопка проигрывания в цикле
      else if(evt.target.equals(btLoop))
      {
        // Запускаем проигрывание в цикле
        appAudio.auClip.loop();

        // Разблокируем кнопку остановки проигрывания
        btStop.enable();
      }

      // Нажата кнопка остановки проигрывания
      else if(evt.target.equals(btStop))
      {
        // Останавливаем проигрывание
        appAudio.auClip.stop();

        // Блокируем кнопку остановки проигрывания
        btStop.disable();
      }

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

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

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

Файл документа HTML, содержащий все три аплета, приведен в листинге 6.2.

Листинг 6.2. Файл Inspector\Inspector.html


<html>
<head>
<title>Inspector</title>
</head>
<body>
<hr>
<applet
    code=Inspector.class
    id=Inspector
    width=320
    height=100 >
</applet>
<hr>
<applet
    code=Audio.class
    id=Audio
    width=320
    height=30 >
    <param name=ClipName value="kaas.au">
</applet>
<hr>
<applet
    code=Rectangles.class
    id=Rectangles
    width=320
    height=240 >
</applet>
<hr>
<a href="Inspector.java">The source.</a>
</body>
</html>

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

Обращаем еще раз ваше внимание на то, что в исходном тексте аплета Inspector импортируется описание класса Audio:


import Audio;

Это необходимо для того чтобы аплет мог получить доступ к полю auClip, определенному в этом аплете.

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

Поля класса Inspector

В поле appContext хранится ссылка на интерфейс AppletContext, с помощью которого мы будем получать список аплетов.

Этот список будет записан в поле eApplets класса Enumeration.

Когда в процессе поиска наш аплет найдет аплет Audio, то в поле appAudio будет записана ссылка на него.

Кроме того, в классе Inspector определены поля btPlay, btLoop и btStop для хранения ссылок на кнопки управления аплетом Audio.

Метод getAppletInfo

Метод getAppletInfo предоставляет другим заинтересованным аплетам (и себе, в частности) строку информации об аплете Inspector. Эта строка аналогична строкам, которые возвращают другие наши аплеты.

Метод init

Метод init создает три кнопки, предназначенные для управления аплетом Audio, причем кнопка с названием Stop блокируется:


btPlay = new Button("Play");
btLoop = new Button("Loop");
btStop = new Button("Stop");
btStop.disable();

Далее созданные кнопки добавляются в окно аплета Inspector.


add(btPlay);
add(btLoop);
add(btStop);

После раскрашивания фона окна и рисования рамки метод paint получает с помощью метода getAppletContext ссылку на интерфейс AppletContext:


appContext = getAppletContext();

Далее с помощью этой ссылки и метода getApplets приложение получает список всех аплетов, расположенных в текущем документе HTML;


eApplets = appContext.getApplets();

Вслед за этим метод paint запускает цикл, в котором он получает ссылки на все найденные аплеты:


while(eApplets.hasMoreElements())
{
  . . .
}

В этом цикле с помощью метода nextElement приложение получает ссылку на очередной аплет и, после преобразования ее к типу Applet, сохраняет в переменной currentApplet:


Applet currentApplet = (Applet)(eApplets.nextElement());

Для каждого найденного аплета вызывается метод getAppletInfo:


appName = currentApplet.getAppletInfo();

Полученная строка обрезается до первого символа возврата каретки или перевода на новую строку и записывается в переменную appName:


StringTokenizer st;
st = new StringTokenizer(appName, "\r\n");
appName = new String((String)st.nextElement());

Содержимое этой переменной (имя аплета) отображается в окне аплета Inspector со сдвигом по вертикали, который завивит от номера найденного аплета:


g.drawString(appName , 10, 15 * i + 50);

В том случае, если в процессе получения строк информации об аплете был найден аплет Audio, выполняется преобразование типа ссылки на этот аплет и сохранение этой ссылки в поле appAudio:


if(appName.equals("Name: Audio"))
{
  appAudio = (Audio)currentApplet;
}

Метод action

Метод action обрабатывает события, вызванные нажатием кнопок в окне аплета Inspector. Обработка заключается в вызове сооветствующего метода с использованием ссылки на аплет Audio. Например, если пользователь нажал кнопку Play, метод action вызывает метод play:


if(evt.target.equals(btPlay))
{
  appAudio.auClip.play();
  btStop.enable();
}

Обратите внимание, что здесь мы ссылаемся через поле appAudio на поле auClip, определенное в аплете Audio.

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