Сценарии JavaScript в активных страницах Web

Вызов методов аплета Java из сценария JavaScript


Сценарий JavaScript может получить доступ к полям и методам аплетов, расположенных в документе HTML, адресуясь к аплетам как к элементам массива document.applets. Например, для доступа к первому аплету вы можете использовать строку document.applets[0]. Однако удобнее указывать имя аплета, заданное в параметре NAME оператора <APPLET>, например document.MyApplet.

В качестве примера покажем, как можно вызывать из сценария JavaScript методы аплета Rectangles, описанного нами в упомянутом выше 32 томе “Библиотеки системного программиста”. Этот аплет рисует в своем окне прямоугольники случайного размера, закрашенные случайным цветом.

Мы создали документ HTML, разместив в нем аплет Rectangles и форму с кнопками Start Animation и Stop Animation (рис. 6.1).

Рис. 6.1. Аплет Rectangles управляется кнопками с помощью сценария JavaScript

Сразу после загрузки документа в окне аплета запускается процесс анимации. Если нажать кнопку Stop Animation, рисование новых прямоугольников будет приостановлено. С помощью кнопки Start Animation можно возобновить процесс рисования.

Заметим, что если поместить курсор мыши в область окна аплета, анимация будет остановлена, а когда курсор мыши покинет пределы окна аплета - снова запущена. Однако такое поведение определяется самим аплетом и не имеет отношения к нашему сценарию JavaScript.

Исходный текст документа HTML, содержащий аплет и форму с кнопками, представлен в листинге 6.1.

Листинг 6.1. Файл chapter6/Rectangles/Rectangles.html

<HTML>

  <HEAD>

    <TITLE>Rectangles</TITLE>

  </HEAD>



  <BODY>

    <HR>

    <APPLET

      CODE=Rectangles.class

      NAME="Rectangles"

      ID=Rectangles

      WIDTH=320

      HEIGHT=240 >

    </APPLET>

    <HR>

    <FORM>

      <INPUT TYPE="button" VALUE="Start Animation" onClick="document.Rectangles.start()">

      <INPUT TYPE="button" VALUE="Stop Animation" onClick="document.Rectangles.stop()">


    </FORM>

    <A HREF="Rectangles.java">The source.</a>

  </BODY>

</HTML>

Здесь параметр NAME оператора <APPLET> задает имя аплета как Rectangles.

Когда пользователь нажимает на кнопку Start Animation, управление получает обработчик события onClick, определенный следующим образом:

onClick="document.Rectangles.start()"

Этот обработчик вызывает метод start, определенный в аплете Rectangles. Этот метод запускает анимацию в окне аплета, если она была остановлена.

Аналогично, обработчик события onClick кнопки Stop Animation вызывает метод stop, также определенный в аплете Rectangles и предназначенный для остановки анимации:

onClick="document.Rectangles.stop()"

Исходный текст аплета Rectangles мы воспроизвели в листинге 6.2. Подробное описание этого аплета вы найдете в разделе “Приложение Rectangles” первой главы 32 тома “Библиотеки системного программиста”.

Листинг 6.2. Файл chapter6/Rectangles/Rectangles.java

// =========================================================

// Рисование прямоугольников в отдельной задаче

//

// (C) Фролов А.В, 1997, 1998

//

// E-mail: frolov@glas.apc.org

// WWW:    http://www.glasnet.ru/~frolov

//            или

//         http://www.dials.ccas.ru/frolov

// =========================================================

import java.applet.*;

import java.awt.*;

import java.util.*;

public class Rectangles extends Applet implements Runnable

{

  // Ссылка на задачу рисования прямоугольников

  Thread m_Rectangles = null;

  // -------------------------------------------------------

  // getAppletInfo

  // Метод, возвращающей строку информации об аплете

  // -------------------------------------------------------

  public String getAppletInfo()

  {

    return "Name: Rectangles\r\n" +

      "Author: Alexandr Frolov\r\n" +

      "E-mail: frolov@glas.apc.org" +

      "WWW:    http://www.glasnet.ru/~frolov" +



      "Created with Microsoft Visual J++ Version 1.0";

  }

  // -------------------------------------------------------

  // paint

  // Метод paint, выполняющий рисование в окне аплета

  // -------------------------------------------------------

  public void paint(Graphics g)

  {

    // Определяем текущие размеры окна аплета

    Dimension dimAppWndDimension = size();

   

    // Выбираем в контекст отображения желтый цвет

    g.setColor(Color.yellow);

   

    // Закрашиваем внутреннюю область окна аплета

    g.fillRect(0, 0,

      dimAppWndDimension.width  - 1,

      dimAppWndDimension.height - 1);

    // Выбираем в контекст отображения черный цвет

    g.setColor(Color.black);

    // Рисуем рамку вокруг окна аплета

    g.drawRect(0, 0,

      dimAppWndDimension.width  - 1,

      dimAppWndDimension.height - 1);

  }

  // -------------------------------------------------------

  // start

  // Метод вызывается при первом отображении окна аплета

  // -------------------------------------------------------

  public void start()

  {

    if (m_Rectangles == null)

    {

      m_Rectangles = new Thread(this);

      m_Rectangles.start();

    }

  }

 

  // -------------------------------------------------------

  // stop

  // Метод вызывается, когда окно аплета исчезает с экрана

  // -------------------------------------------------------

  public void stop()

  {

    if (m_Rectangles != null)

    {

      m_Rectangles.stop();

      m_Rectangles = null;

    }

  }

  // -------------------------------------------------------

  // run

  // Метод, который работает в рамках отдельной задачи

  // Он рисует в окне аплета прямоугольники случайного

  // цвета, размера и расположения

  // -------------------------------------------------------

  public void run()

  {

    // Получаем контекст отображения для окна аплета

    Graphics g = getGraphics();

    // Определяем текущие размеры окна аплета



    Dimension dimAppWndDimension = size();

    while (true)

    {

      int x, y, width, height;

      int rColor, gColor, bColor;

     

      // Выбираем случайным образом размеры

      // и расположение рисуемого прямоугольника

      x = (int)(dimAppWndDimension.width * Math.random());

      y = (int)(dimAppWndDimension.height * Math.random());

      width = (int)(dimAppWndDimension.width *

              Math.random()) / 2;

      height = (int)(dimAppWndDimension.height *

              Math.random()) / 2;

      

      // Выбираем случайный цвет для рисования

      // прямоугольника

      rColor = (int)(255 * Math.random());

      gColor = (int)(255 * Math.random());

      bColor = (int)(255 * Math.random());

      // Устанавливаем выбранный цвет в контексте

      // отображения

      g.setColor(new Color(rColor, gColor, bColor));

      // Рисуем прямоугольник

      g.fillRect(x, y, width, height);

      // Выполняем задержку на 50 миллисекунд

      try

      {

        Thread.sleep(50);

      }

      catch (InterruptedException e)

      {

        stop();

      }

    }

  }

  // -------------------------------------------------------

  // mouseEnter

  // Метод вызывается, когда курсор мыши оказывается над

  // окном аплета

  // -------------------------------------------------------

  public boolean mouseEnter(Event evt, int x, int y)

  {

    if (m_Rectangles != null)

    {

      // Когда курсор мыши оказывается над поверхностью

      // окна аплета, временно приостанавливаем

      // задачу рисования прямоугольников

      m_Rectangles.suspend();

    }

    return true;

  }

  // -------------------------------------------------------

  // mouseExit

  // Метод вызывается, когда курсор мыши покидает

  // окно аплета

  // -------------------------------------------------------

  public boolean mouseExit(Event evt, int x, int y)

  {

    if (m_Rectangles != null)

    {

      // Когда курсор мыши покидает окно аплета,

      // возобновляем работу задачи рисования

      // прямоугольников

      m_Rectangles.resume();

    }

    return true;

  }

}


Содержание раздела