Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Список аплетов

Вызов метода из другого аплета
Параметры другого аплета
Поле другого аплета
Кнопки с зависимой фиксацией

Назад

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 мы показали пример использования переключателя с зависимой фиксацией.

pic1.gif (6042 bytes)

Рис. 1. В правый фрейм загружена белая страница, при этом нажата кнопка White

pic2.gif (6564 bytes)

Рис. 2. В правый фрейм загружена красная страница, при этом нажата кнопка Red

pic3.gif (6516 bytes)

Рис. 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.


Назад

[Назад]