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