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

на главную - закладки

Жанры

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

Обратите внимание на то, что класс Banner не только является подклассом, производным от класса Applet, но и реализует интерфейс Runnable. Это необходимо потому, что апплет создает еще один поток исполнения, который служит для прокрутки крупного заголовка по горизонтали. Текст крупного заголовка хранится в переменной msg типа String, ссылка на поток, в котором выполняется апплет, хранится в переменной t, а логическая переменная stopFlag служит для остановки апплета. В методе init переменной t исходно присваивается пустое значение null.

Введите метод start , исходный код которого приведен ниже. // запустить поток public void start { t = new Thread(this); stopFlag = false; t.start; } Исполняющая система вызывает метод start для запуска апплета на выполнение. В этом методе создается новый поток

исполнения, а ссылка на него присваивается переменной t типа Thread. Затем переменная stopFlag инициализируется логическим значением false. Далее поток запускается при вызове t. start . Это, в свою очередь, приводит к вызову метода run . Следует, однако, иметь ввиду, что метод start из класса Thread не имеет ничего общего с одноименным методом, определенным в классе Applet.

Введите метод run , исходный код которого приведен ниже. // Точка входа в поток, манипулирующий крупным заголовком, public void run { // отобразить крупный заголовок снова for( ; ; ) { try { repaint ; Thread.sleep(250); if(stopFlag) break; } catch(InterruptedException exc) {} } } В методе run вызывается метод repaint , что в конечном итоге приводит к вызову метода paint и отображению текущего содержимого переменной msg на экране. Между последовательными шагами цикла выполнение метода run приостанавливается на четверть секунды. В результате содержимое переменной msg постоянно прокручивается справа налево. На каждом шаге цикла проверяется содержимое переменной stopFlag. И как только она примет логическое значение true, выполнение метода run завершится.

Введите методы 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.

Поделиться:
Популярные книги

Двойник короля 17

Скабер Артемий
17. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 17

Авиатор: назад в СССР

Дорин Михаил
1. Авиатор
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Авиатор: назад в СССР

Лондон

Резерфорд Эдвард
The Big Book
Проза:
историческая проза
6.67
рейтинг книги
Лондон

Локки 10. Потомок бога

Решетов Евгений Валерьевич
10. Локки
Фантастика:
фэнтези
юмористическое фэнтези
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 10. Потомок бога

Изгой Проклятого Клана. Том 5

Пламенев Владимир
5. Изгой
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 5

Оживший камень

Кас Маркус
1. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Оживший камень

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание

Двойник Короля 6

Скабер Артемий
6. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 6

Мастер решений

Земляной Андрей Борисович
3. Специалист по выживанию
Фантастика:
боевая фантастика
космическая фантастика
6.20
рейтинг книги
Мастер решений

Хроники Тириса. Книга 1

Маханенко Василий Михайлович
1. Хроники Тириса
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
6.00
рейтинг книги
Хроники Тириса. Книга 1

Евреи России. Времена и события. История евреев Российской империи

Кандель Феликс Соломонович
Научно-образовательная:
история
5.00
рейтинг книги
Евреи России. Времена и события. История евреев Российской империи

Слезы Эйдена 1

Владимиров Денис
11. Глэрд
Фантастика:
боевая фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Слезы Эйдена 1

Родословная. Том 1

Ткачев Андрей Юрьевич
1. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Родословная. Том 1

Хозяин Стужи 4

Петров Максим Николаевич
4. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 4