Чтение онлайн

ЖАНРЫ

Java: руководство для начинающих
Шрифт:

Введите методы stop и paint , исходный код которых приведен ниже. // остановить выполнение апплета public void stop { stopFlag = true; t = null; } // отобразить крупный заголовок public void paint(Graphics g) { char ch; ch = msg.charAt(0); msg = msg.substring(1, msg.length); msg += ch; g.drawstring(msg, 50, 30); }

Если пользователь браузера переходит на другую веб-страницу, вызывается метод stop , в котором переменной stopFlag присваивается логическое значение true, завершая тем самым выполнение метода run . В этом же методе переменной t присваивается пустое значение null. После этого она уже не ссылается на объект типа Thread, а следовательно, этот объект будет удален системой “сборки мусора”. Этот механизм используется для остановки потока, когда страница с апплетом не просматривается. Когда же она снова появляется в окне браузера, вызывается метод start , запускающий новый поток манипулирования крупным заголовком.

В методе paint символы строки крупного заголовка, хранящегося в переменной msg, постоянно сдвигаются влево. После каждого сдвига вызывается метод drawstring , выводящий текущее содержимое переменной msg на экран.

Ниже приведен весь исходный код апплета для формирования крупного заголовка на веб-странице. /* Пример

для опробования 14.1. Простой апплет, отображающий крупный заголовок. В этом апплете создается поток, управляющий прокруткой крупного заголовка, хранящегося в переменной msg, справа налево в окне апплета. */ import java.awt.*; import java.applet.*; /* <applet code=,,Banner,f width=300 height=50> </applet> */ public class Banner extends Applet implements Runnable { String msg = " Java Rules the Web "; // "Java правит Паутиной" Thread t; boolean stopFlag; // инициализировать переменную t пустым значением null public void init { t = null; } // запустить поток public void start { t = new Thread(this) ; stopFlag = false; t.start; } // Точка входа в поток, манипулирующий крупным заголовком, public void run { // отобразить крупный заголовок снова for( ; ; ) { try { repaint ; Thread.sleep(250); if(stopFlag) break; } catch(InterruptedException exc) {} } } // остановить выполнение апплета public void stop { stopFlag = true; t = null; } // отобразить крупный заголовок public void paint(Graphics g) { char ch; ch = msg.charAt(0) ; msg = msg.substring(1, msg.length); msg += ch; g.drawstring(msg, 50, 30); } }

Ниже приведен результат выполнения данного апплета. Применение строки состояния

Помимо отображения информации в основном окне, апплет может также выводить сообщения в строке состояния браузера или другого средства просмотра апплетов. Для вывода сообщения в строке состояния следует вызвать метод showStatus , определенный в классе Applet. При вызове этому методу в качестве параметра передается выводимая символьная строка. Ниже приведена общая форма объявления метода showStatus. void showStatus(String сообщение)

где сообщение обозначает выводимую символьную строку.

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

Ниже приведен пример апплета, демонстрирующий применение метода showStatus. // Использование строки состояния, import java.awt.*; import java.applet.*; /* <applet code="StatusWindow" width=300 height=50> </applet> */ public class StatusWindow extends Applet{ // отобразить содержимое переменной msg в окне апплета public void paint(Graphics g) { g.drawString("This is in the applet window.", 10, 20); showStatus("This is shown in the status window."); } }

Выполнение этого апплета дает приведенный ниже результат.

Передача параметров апплету

По мере необходимости апплету можно передать один или более параметр. Для этой цели предусмотрен атрибут PARAM дескриптора APPLET. С его помощью задается имя и значение параметра. А для извлечения параметра служит метод getParameter , определенный в классе Applet. Он объявляется следующим образом: String getParameter(String имя_параметра)

где имя_параметра обозначает конкретное имя передаваемого параметра. Этот метод возвращает значение указанного параметра в виде объекта типа String. Так, если апплету требуется передать числовое или логическое значение, его строковое представление придется преобразовать во внутренний формат. Если же указанный параметр не найден, метод возвращает пустое значение null. Поэтому в исходный код апплетов следует включать проверку правильности значений, возвращаемых методом getParameter . Желательно также проверять, правильно ли было выполнено преобразование числового значения параметра, передаваемого апплету.

Ниже приведен пример, демонстрирующий процесс передачи параметров апплету. // Передача параметров апплету, import java.awt.*; import java.applet.*; // Параметры передаются апплету в коде HTML. /* <applet code=nParamu width=300 height=80> <param name=author value="Herb Schildt"> <param name=purpose value="Demonstrate Parameters'^ <param name=version value=2> </applet> */ public class Param extends Applet { String author; String purpose; int ver; public void start { String temp; author = getParameter("author"); // Важно убедиться в существовании параметра. if(author == null) author = "not found"; purpose = getParameter("purpose"); if(purpose == null) purpose = "not found"; temp = getParameter("version"); try { if(temp != null) ver = Integer.parselnt(temp); else ver = 0; //He менее важно убедиться, что преобразование // числового значения параметра выполнено правильно. } catch(NumberFormatException exc) { ver = -1; // Код ошибки } } public void paint(Graphics g) { g.drawstring("Purpose: " + purpose, 10, 20); g.drawString("By: " + author, 10, 40); g.drawstring("Version: " + ver, 10, 60); } }

Выполнение этого апплета дает приведенный ниже результат.

Класс Applet

Как пояснялось ранее, все апплеты представляют собой подклассы, производные от класса Applet. Класс Applet наследует переменные и методы следующих классов из библиотеки AWT: Component, Container и Panel. В результате апплет получает все функциональные возможности, доступные в библиотеке AWT.

Помимо методов, рассмотренных в предыдущих разделах, класс Applet содержит ряд других методов, которые предоставляют средства для более полного управления процессом выполнения апплетов. Все методы, определенные в классе Applet, приведены в табл. 14.1.

Таблица 14.1. Методы, определенные в классе Applet Метод Описание void destroy Вызывается браузером непосредственно перед завершением апплета. Если же перед завершением апплета требуется освободить ресурсы или выполнить какие-нибудь другие подготовительные действия, этот метод следует переопределить AccessibleContext getAccessibleContext Возвращает контекст

доступности для вызывающего объекта AppletContext getAppletContext Возвращает контекст, связанный с апплетом String getAppletlnfо Возвращает строку, описывающую апплет AudioClip getAudioClip(URL url) Возвращает объект типа AudioClip, инкапсулирующий аудиоклип, доступный по адресу, задаваемому параметром url AudioClip getAudioClip(URL url, String clipName) Возвращает объект типа AudioClip, инкапсулирующий аудиоклип, доступный по адресу, задаваемому параметром url, и называемый по имени, которое указывает параметр clipName URL getCodeBase Возвращает веб-адрес (URL), связанный с апплетом URL getDocumentBase Возвращает веб-адрес (URL) того HTML-документа, который вызывает апплет Image getlmage(URL url) Возвращает объект типа Image, инкапсулирующий изображение, доступное в месте, определяемом параметром url Image getlmage (URL url, String imageName) Возвращает объект типа Image, инкапсулирующий изображение, доступное в месте, определяемом параметром url, и называемое по имени, указываемому параметром imageName Locale getLocale Возвращает объект типа Locale, который используется классами и методами, реагирующими на настройки региональных и языковых параметров системы String getParameter(String paramName) Возвращает параметр по имени, указываемому параметром paramName. Если параметр не найден, возвращается пустое значение null String[][] getParameterlnfо Переопределенный вариант этого метода возвращает таблицу объектов типа String с описанием параметров, распознаваемых апплетом. Каждый элемент таблицы должен состоять из трех строк, содержащих имя параметра, описание его типа и/или диапазона допустимых значений, а также краткое пояснение назначения параметра. В исходном варианте реализации этот метод возвращает пустое значение null void init Этот метод выполняется первым при запуске любого апплета на выполнение boolean isActive Возвращает логическое значение true, если апплет выполняется. А если выполнение апплета приостановлено, то возвращает логическое значение false boolean isValidateRoot Возвращает логическое значение true, указывающее на то, что апплет является достоверным корнем, т.е. он прошел проверку на достоверность. (Добавлен в версии JDK 7.) static final AudioClip newAudioClip(URL url) Возвращает объект типа AudioClip, инкапсулирующий аудиоклип, доступный по адресу, задаваемому параметром url. Этот метод подобен методу getAudioClip, за исключением того, что онявляется статическим и для его вызова не требуется ссылка на объект типа Applet void play(URL url) Воспроизводит аудиоклип, если он найден по адресу, задаваемому параметром url void play (URL url, String clipName) Воспроизводит аудиоклип, если он найден по адресу, задаваемому параметром url, под именем, обозначаемым параметром clipName void resize(Dimensiondim) Изменяет размеры апплета по значениям, указываемым параметром dim. Класс Dimension входит в пакет java.awt. В нем содержатся два целочисленных поля, width и height, в которых задаются ширина и высота апплета соответственно void resize (int width, int height) Изменяет размеры апплета по значениям, указываемым параметрами width и height final voidsetStub(AppletStub stubObj) Задает stubObj в качестве заглушки для апплета. Используется в основном исполняющей системой и не вызывается из апплета. Заглушкой называется фрагмент кода, устанавливающий связь между апплетом и браузером void showStatus(String str) Отображает символьную строку str в строке состояния браузера или другом средстве просмотра апплетов. Если строка состояния отсутствует в браузере, никакие действия не выполняются void start Вызывается браузером в том случае, если апплет должен начать (или возобновить) свое выполнение. Этот метод вызывается при запуске апплета на выполнение после метода init void stop Вызывается браузером с целью приостановить выполнение апплета.Выполнение приостановленного апплета может быть возобновлено вызовом метода start Обработка событий

Все программы, написанные на Java с графическим пользовательским интерфейсом, в том числе и апплеты, управляются событиями. Следовательно, обработка событий служит основанием для успешного программирования графического пользовательского интерфейса. Большинство событий, на которые должна реагировать подобная программа, наступают в результате действий пользователя. Эти события передаются программе разными способами. События разделяются на отдельные категории, например события от мыши, клавиатуры, а также события, наступающие в результате взаимодействия пользователя с элементами пользовательского интерфейса. Классы поддержки событий в библиотеке AWT относятся к пакету j ava. awt. event.

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

Современный подход к обработке событий основывается на модели делегирования событий. Эта модель описывает стандартный механизм формирования событий и их обработки. Она действует по очень простому принципу: событие формируется источником и передается одному или нескольким приемникам. В соответствии с этим принципом приемники лишь ожидают события. При наступлении событий они обрабатывают их и возвращают управление. Преимущество такого подхода заключается в том, что логика обработки событий четко отделена от логики пользовательского интерфейса, ющего эти события. Элемент пользовательского интерфейса способен делегировать (т.е. поручать) обработку события отдельному фрагменту кода. В модели делегирования событий их приемники должны быть зарегистрированы в источнике, чтобы получать уведомления о событиях для их последующей обработки. События

Согласно модели делегирования, событие является объектом, описывающим изменения в состоянии источника. Событие может быть сформировано в результате действий пользователя, в том числе активизации элементов графического пользовательского интерфейса. Такими действиями может быть нажатие кнопки, ввод символа с клавиатуры, выбор пункта списка или щелчок кнопкой мыши. Источники событий

Источник события — это объект, сформировавший его. Для того чтобы приемник получил уведомление о конкретном виде события, он должен быть зарегистрирован в его источнике. Для каждого вида события определен собственный метод регистрации. Ниже приведена общая форма объявления методов регистрации. public void addТипListener(TnnListener элемент)

Поделиться с друзьями: