Назад
10.5. Кнопки с зависимой фиксацией
Пример показывает практическое применение
механизма взаимодействия аплетов для
организации переключателя с зависимой
фиксацией. Переключатель состоит из кнопок,
выполненных с применением одного и того же
аплета. Когда пользователь нажимает на такую
кнопку, она фиксируется в нажатом состоянии. Все
остальные кнопки переключателя при этом
возвращаются в исходное состояние.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Немного теории
В качестве одного из практических применений
возможности взаимодействия аплетов можно
предложить идею создания кнопочного
переключателя с зависимой фиксацией. Каждая
кнопка такого переключателя может представлять
собой аплет, способный взаимодействовать со
своими копиями, расположенными в одном и том же
документе HTML.
Когда пользователь нажимает на кнопку, она
надавливается. Затем аплет находит все другие
свои копии и возвращает их в отжатое состояние.
Но как аплет сумеет отличить себя от своих
копий с таким же именем?
Это можно сделать простым сравнением ссылок на
все аплеты со значением this:
ac = getAppletContext();
enApplets = ac.getApplets();
while(enApplets.hasMoreElements())
{
ap = (Applet)(enApplets.nextElement());
if(ap != this)
{
. . .
}
}
Здесь мы выполняем в цикле некоторые действия
со всеми копиями аплетов, кроме того, на котором
был запущен данный фрагмент кода.
Что же касается изменения состояния других
аплетов, то эту операцию можно выполнить, вызвав
специально предусмотренный для этого метод,
объявленный как public.
Описание примера
При создании этого примера мы взяли за основу
аплет-кнопку, описанный нами в разделе "3.3. Кнопка в виде аплета".
Напомним, что будучи размещенным в документе HTML,
такой аплет позволял пользователю загружать те
или иные страницы в окно браузера простым
нажатием кнопки.
Новый пример аплета RadioAppButton, исходный текст
которого описан в этом разделе, больше всего
подходит для применения на страницах,
подготовленных с использованием фреймов.
Расположив кнопки в левом фрейме, вы можете
организовать просмотр страниц в правом фрейме
(или наоборот). Причем пользователю будет видно,
какой кнопке соответствует загруженная
страница, так как соответствующая кнопка
останется в нажатом состоянии.
На рис. 1-3 мы показали пример использования
переключателя с зависимой фиксацией.
Рис. 1. В правый фрейм загружена белая страница,
при этом нажата кнопка White
Рис. 2. В правый фрейм загружена красная
страница, при этом нажата кнопка Red
Рис. 3. В правый фрейм загружена зеленая
страница, при этом нажата кнопка Green
Рассмотрим фрагменты исходного текста аплета
RadioAppButton, отвечающие за взаимодействие аплетов.
Более подробное описание остальных полей и
методов вы найдете в разделе "3.3. Кнопка в виде аплета".
Главный класс аплета RadioAppButton
В главном классе аплета по сравнению и исходным
текстом из "3.3. Кнопка в
виде аплета" мы дополнительно определили
поле bStartAnimation:
boolean bStartAnimation = false;
В это поле записывается значение true только в
том случае, если в окне кнопки выполняется
анимация.
Метод paint
Рассмотрим изменения, внесенные нами в метод
paint.
Когда кнопка находится в отжатом состоянии,
метод paint рисует соответствующее изображение в
окне кнопки и подписывает ее:
if(bButtonUp)
{
g.drawImage(imgButtonUp, 0, 0, this);
g.setColor(clrTitleColor);
g.drawString(parmTitle, x0, y0);
}
В противном случае рисуется изображение
нажатой кнопки:
else
{
g.drawImage(imgButtonDn, 0, 0, this);
if(bStartAnimation == false)
{
g.setColor(clrTitleColor);
}
else
g.setColor(Color.blue);
g.drawString(parmTitle,
x0 - nShadowValue, y0 - nShadowValue);
}
Здесь мы дополнительно проверяем флаг bStartAnimation.
Если для кнопки была запущена анимация, ее
заголовок рисуется синим цветом.
Метод mouseDown
Когда пользователь нажимает кнопку, делая в ее
окне щелчок клавишей мыши, управление передается
методу mouseDown. Наша новая реализация этого метода
выполняет поиск всех аплетов в текущем документе
HTML:
public boolean mouseDown(
Event ev, int x, int y)
{
AppletContext ac;
Enumeration enApplets;
Applet ap;
ac = getAppletContext();
enApplets = ac.getApplets();
while(enApplets.hasMoreElements())
{
ap = (Applet)(enApplets.nextElement());
if(ap != this)
{
((RadioAppButton)ap).popButton();
}
}
. . .
}
Здесь используется уже знакомая вам техника,
основанная на использовании интерфейса AppletContext и
метода getApplets.
Для всех найденных аплетов предпринимается
попытка вызова метода popButton, возвращающая кнопку
в отжатое состояние. Заметим, что данная
реализация метода предполагает, что в документе
нет других аплетов, кроме аплетов класса RadioAppButton
- только там есть определенный нами метод popButton.
Далее метод mouseDown переводит текущий аплет в
состояние, соответствующее нажатой кнопке, и
перерисовывает свое окно:
if(bButtonUp)
{
bButtonUp = false;
repaint();
doButtonAction();
}
return true;
Затем метод mouseDown вызывает метод doButtonAction,
загружающий документ HTML в указанное окно
браузера.
Метод popButton
Метод popButton переводит аплет в состояние отжатой
кнопки простым изменением флага bButtonUp с
последующей перерисовкой окна аплета:
public boolean popButton()
{
if(!bButtonUp)
{
bButtonUp = true;
repaint();
}
return true;
}
Метод mouseEnter
Когда пользователь располагает курсор над
поверхностью аплета, метод mouseEnter проверяет флаг
bAnimate, управляющей анимацией. Если этот флаг
установлен, то анимация разрешена и метод mouseEnter
запускает поток анимации.
Дополнительно после запуска потока мы
устанавливаем флаг bStartAnimation, проверяемый в
методе paint:
public boolean mouseEnter(
Event ev, int x, int y)
{
if(bAnimate)
{
if(threadAnimate == null)
{
threadAnimate = new Thread(this);
threadAnimate.start();
}
bStartAnimation = true;
}
return true;
}
Метод mouseExit
Этот метод мы дополнили строкой, сбрасывающей
флаг анимации bStartAnimation при удалении
пользователем курсора мыши за пределы окна
аплета:
public boolean mouseExit(
Event ev, int x, int y)
{
if(bAnimate)
{
if(threadAnimate != null)
{
threadAnimate.stop();
threadAnimate = null;
clrTitleColor = Color.black;
}
}
bStartAnimation = false;
repaint();
return true;
}
Метод doButtonAction
Изменения, внесенные нами в этот метод,
касаются способа указания адресной ссылки, по
которой выполняется переход при нажатии на
кнопку.
Теперь адрес ссылки должен указываться не
полностью, а относительно каталога, где
расположен наш аплет. Мы соответствующим образам
изменили способ формирования адреса URL:
url = new URL(
getCodeBase().toExternalForm() +
"/" + parmURL);
Теперь значение, указанное в соответствующем
параметре аплета, добавляется к адресу аплета,
извлеченному методом getCodeBase.
Назад |