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. |


