| Назад 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. 
 Назад |