Шрифт:
Ниже приведена простейшая форма вызова метода repaint . void repaint
Этот метод производит перерисовку всего окна апплета.
В другой форме вызова метода repaint задается конкретная область для перерисовки. void repaint(int слева, int сверху, int ширина, int высота)
Координаты верхнего левого угла перерисовываемой области задаются с помощью параметров слева и сверху, а параметры ширина и высота определяют конкретную ширину и высоту этой области. Все размеры задаются в пикселях. Указывая области для перерисовки, можно значительно увеличить быстродействие программы, поскольку для обновления содержимого окна требуется немало времени. Если же требуется перерисовать лишь небольшую область, то задавать обновление всего окна нет никакой надобности.
Применение метода repaint будет продемонстрировано в примере для опробования 14.1. Метод update
Перерисовку окна апплета можно организовать и с помощью метода update , который переопределяется во многих апплетах. Этот метод объявляется в классе Component и вызывается в том случае, если требуется перерисовать часть окна апплета. В используемом по умолчанию варианте метода update просто вызывается метод paint . Но, переопределив метод update , можно выполнить и более сложные операции, рассмотрение которых, впрочем, выходит за рамки этой книги. Переопределение метода update осуществляется только в апплетах, создаваемых на основе библиотеки AWT.
Пример для опробования 14.1. Простой апплет для формирования крупного заголовка на веб-странице
Работу метода repaint удобно продемонстрировать на примере следующего простого апплета. Он выполняет прокрутку крупного заголовка в окне слева направо. А поскольку такую прокрутку нужно выполнять постоянно, то реализовать ее следует в отдельном потоке, который создается при инициализации апплета. Подобные крупные заголовки называются еще баннерами и часто встречаются на веб-страницах, а в этом проекте демонстрируется, каким образом можно создать такой заголовок, используя апплет Java.
Последовательность действий
Создайте файл Banner.java.
Начните создание апплета со следующих строк кода: /* Пример для опробования 14.1. Простой апплет, отображающий крупный заголовок. В этом апплете создается поток, управляющий прокруткой крупного заголовка, хранящегося в переменной msg, справа налево в окне апплета. */ import java.awt.*; import java.applet.*; /* <applet code="Banner" 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; } }
Обратите внимание на то, что класс 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 , запускающий новый поток манипулирования крупным заголовком.