Апплет – это программа Java, запускаемая в веб-браузере. Апплет может быть полнофункциональным Java-приложением, поскольку имеет в своем распоряжении весь прикладной программный интерфейс Java.

Между апплетом и автономным Java-приложением есть некоторые важные различия, в том числе следующие:

  • Апплет это класс Java, расширяющий класс java.applet.Applet.
  • Метод main() не вызывается в апплете, и класс Applet не определяет main().
  • Динамические сетевые программы предназначены для встраивания в HTML-страницу.
  • Если пользователь просматривает HTML-страницу, содержащую апплет, код для апплета загружается на компьютер пользователя.
  • Для просмотра апплета требуется виртуальная машина Java. Виртуальная машина Java может быть либо подключаемым модулем веб-браузера, либо отдельной средой выполнения.
  • Виртуальная машина Java на устройстве пользователя создает экземпляр класса Applet и вызывает различные методы в течение жизненного цикла апплета.
  • Динамические сетевые программы имеют строгие правила безопасности, которые соблюдаются веб-браузером. Безопасность апплета часто называют службой безопасности изолированной программной среды, когда апплет сравнивают с ребенком, играющим в песочнице с различными правилами, которые необходимо соблюдать.
  • Другие классы, которые нужны апплету, можно загрузить в одном файле архива Java (JAR).

Жизненный цикл апплета

Четыре метода в классе Applet определяют основу для создания любого серьезного апплета:

  • init – этот метод предназначен для любой инициализации, необходимой для вашего апплета. Он вызывается после обработки тегов параметров внутри тега апплета.
  • start – этот метод автоматически вызывается после того, как браузер вызывает метод init. Он также вызывается всякий раз, когда пользователь возвращается на страницу, содержащую апплет, после перехода на другие страницы.
  • stop – этот метод автоматически вызывается, когда пользователь покидает страницу, на которой находится апплет. Поэтому его можно вызывать повторно в одном и том же апплете.
  • destroy – этот метод вызывается только при обычном завершении работы браузера. Поскольку апплеты предназначены для размещения на странице HTML, обычно не следует оставлять ресурсы после того, как пользователь покидает страницу, содержащую апплет.
  • paint – вызывается сразу после метода start(), а также каждый раз, когда апплету необходимо перерисовать свой образ в браузере. Метод paint() фактически унаследован от java.awt.

Динамическая сетевая программа "Привет, Мир"

Ниже приведен простой апплет HelloWorldApplet.java.

import java.applet.*;
import java.awt.*;

public class HelloWorldApplet extends Applet {
   public void paint (Graphics g) {
      g.drawString ("Привет, Мир", 25, 50);
   }
}

Эти операторы импорта переносят классы в область действия нашего класса Applet:

  • java.applet.Applet
  • java.awt.Graphics

Без этих операторов импорта компилятор Java не распознал бы классы Applet и Graphics, на которые ссылается класс Applet.

Класс Applet

Каждый апплет является расширением класса java.applet.Applet. Базовый класс Applet предоставляет методы, которые производный класс Applet может вызывать для получения информации и служб из контекста браузера.

К ним относятся методы, которые выполняют следующее:

  • Получают параметры апплета.
  • Получают сетевое расположение файла HTML, содержащего апплет.
  • Получают сетевое расположение каталога классов апплета.
  • Выводят статусное сообщение в браузере.
  • Получают изображение.
  • Получают аудиоклип.
  • Воспроизводят аудиоклип.
  • Изменяют размер апплета.

Кроме того, класс Applet предоставляет интерфейс, с помощью которого средство просмотра или браузер получает информацию об апплете и управляет его выполнением. Зритель может:

  • Запросить информацию об авторе, версии и авторских правах апплета.
  • Запросите описание параметров, которые распознают апплет.
  • Инициализировать апплет.
  • Удалить апплет.
  • Запустить выполнение апплета.
  • Остановить выполнение апплета.

Класс Applet предоставляет реализации по умолчанию для каждого из этих методов. При необходимости эти реализации могут быть отменены.

Динамическая сетевая программа Hello, World скомпилирована в данных условиях. Единственный переопределяемый метод – это метод отрисовки.

Вызов апплета

Динамическая сетевая программа может быть вызвана путем встраивания директив в файл HTML и просмотра файла через программу просмотра апплета или браузер с поддержкой Java.

Тег <applet> является основой для встраивания апплета в файл HTML. Ниже приведен пример, вызывающий апплет Hello, World.

<html>
   <title>The Hello, World Applet</title>
   <hr>
   <applet code = "HelloWorldApplet.class" width = "320" height = "120">
      Если ваш браузер содержит Java, появится 
      сообщение "Привет, Мир".
   </applet>
   <hr>
</html>

Примечание. Вы можете обратиться к HTML-тегу апплета, чтобы узнать больше о вызове апплета из HTML.

Атрибут кода тега <applet> является обязательным. Он определяет запускаемый класс Applet. Ширина и высота также необходимы для указания начального размера панели, на которой запускается апплет. Директива апплета должна быть закрыта тегом </applet>.

Если апплет принимает параметры, для параметров можно передать значения, добавив теги <param> между <applet> и </applet>. Браузер игнорирует текст и другие теги между тегами апплета.

Браузеры без поддержки Java не обрабатывают <applet> и </applet>. Следовательно, все, что появляется между тегами, не связанное с апплетом, отображается в браузерах без поддержки Java.

Средство просмотра или браузер ищет скомпилированный код Java в том месте, где находится документ. Чтобы указать иное, используйте атрибут кодовой базы тега <applet>, как показано далее:

<applet codebase = "https://amrood.com/applets" code = "HelloWorldApplet.class"
   width = "320" height = "120">

Если апплет находится в пакете, отличном от пакета по умолчанию, пакет хранения должен быть указан в атрибуте кода с использованием символа точки (.) для разделения компонентов пакета/класса. Например:

<applet  = "mypackage.subpackage.TestApplet.class" 
   width = "320" height = "120">

Получение параметров апплета

В следующем примере показано, как заставить апплет реагировать на параметры настройки, указанные в документе. Этот апплет отображает узор шахматной доски черного и второго цвета.

Второй цвет и размер каждого квадрата могут быть указаны в качестве параметров апплета в документе.

CheckerApplet получает свои параметры в методе init(). Он также может получать свои параметры в методе paint(). Однако получение значений и сохранение настроек один раз при запуске апплета, а не при каждом обновлении, более удобно и эффективно.

Средство просмотра апплета или браузер вызывает метод init() для каждого апплета, который он запускает. Программа просмотра вызывает init() один раз, сразу после загрузки апплета. (Applet.init() не выполняет никаких функций.) Переопределите реализацию по умолчанию, чтобы вставить пользовательский код инициализации.

Метод Applet.getParameter() выбирает параметр по имени параметра (значение параметра всегда является строкой). Если значение представлено числовыми или другими небуквенными данными, строку необходимо проанализировать.

Ниже приведен скелет программы CheckerApplet.java

import java.applet.*;
import java.awt.*;

public class CheckerApplet extends Applet {
   int squareSize = 50;   // инициализирован размер по умолчанию
   public void init() {}
   private void parseSquareSize (String param) {}
   private Color parseColor (String param) {}
   public void paint (Graphics g) {}
}

Вот метод CheckerApplet's init() и частный метод parseSquareSize():

public void init () {
   String squareSizeParam = getParameter ("размер квадрата");
   parseSquareSize (squareSizeParam);
   
   String colorParam = getParameter ("цвет");
   Color fg = parseColor (colorParam);
   
   setBackground (Color.black);
   setForeground (fg);
}

private void parseSquareSize (String param) {
   if (param == null) return;
   try {
      squareSize = Integer.parseInt (param);
   } catch (Exception e) {
      // Оставим значение по умолчанию
   }
}

Динамическая сетевая программа вызывает parseSquareSize() для анализа параметра squareSize. parseSquareSize() вызывает библиотечный метод Integer.parseInt(), который анализирует строку и возвращает целое число. Integer.parseInt() выдает исключение всякий раз, когда его аргумент недопустим.

Следовательно, parseSquareSize() перехватывает исключения, а не позволяет апплету останавливаться при неверном вводе.

Динамическая сетевая программа вызывает parseColor(), чтобы проанализировать параметр цвета в значение цвета. parseColor() выполняет серию сравнений строк, чтобы сопоставить значение параметра с именем предопределенного цвета. Вам необходимо реализовать эти методы, чтобы этот апплет работал.

Определение параметров апплета

Ниже приведен пример HTML-файла со встроенным CheckerApplet. Файл HTML определяет оба параметра апплета с помощью тега <param>.

<html>
   <title>Checkerboard Applet</title>
   <hr>
   <applet code = "CheckerApplet.class" width = "480" height = "320">
      <param name = "цвет" value = "синий">
      <param name = "размер  квадрата" value = "30">
   </applet>
   <hr>
</html>

Примечание: в именах параметров не учитывается регистр.

Преобразование приложений в апплет

Графическое приложение Java (то есть приложение, которое использует графический интерфейс пользователя и которое можно запускать с помощью средства запуска программ Java) легко преобразовать в апплет, которую можно встроить в веб-страницу.

Ниже приведены конкретные шаги для преобразования приложения в апплет.

  • Создайте HTML-страницу с соответствующим тегом для загрузки кода апплета.
  • Предоставьте подкласс класса JApplet. Сделайте этот класс общедоступным. В противном случае апплет не может быть загружен.
  • Исключите основной метод в приложении. Не создавайте рамочное окно для приложения. Ваше приложение будет отображаться внутри браузера.
  • Переместите любой код инициализации из конструктора рамочного окна в метод инициализации апплета. Вам не нужно явно создавать объект апплета. Браузер создает его для вас и вызывает метод init.
  • Удалите вызов setSize; для апплета размер задается с указанием параметров ширины и высоты в файле HTML.
  • Удалите вызов setDefaultCloseOperation. Динамическую сетевую программу нельзя закрыть; она завершается, когда браузер закрывается.
  • Если приложение вызывает setTitle, исключите вызов метода. Динамические сетевые программы не могут иметь заголовков. (Вы, конечно, можете присвоить заголовок самой веб-странице, используя тег заголовка HTML.)
  • Не вызывайте setVisible(true). Динамическая сетевая программа отображается автоматически.

Обработка событий

Динамические сетевые программы наследуют группу методов обработки событий от класса Container. Класс Container определяет несколько методов, таких как processKeyEvent и processMouseEvent, для обработки определенных типов событий, а затем один универсальный метод, называемый processEvent.

Чтобы отреагировать на событие, апплет должен переопределить соответствующий метод для конкретного события.

import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.applet.Applet;
import java.awt.Graphics;

public class ExampleEventHandling extends Applet implements MouseListener {
   StringBuffer strBuffer;

   public void init() {
      addMouseListener(this);
      strBuffer = new StringBuffer();
      addItem("инициализация апплета ");
   }

   public void start() {
      addItem("запуск апплета ");
   }

   public void stop() {
      addItem("остановка апплета ");
   }

   public void destroy() {
      addItem("выгрузка апплета ");
   }

   void addItem(String word) {
      System.out.println(word);
      strBuffer.append(word);
      repaint();
   }

   public void paint(Graphics g) {
      // Нарисуйте прямоугольник вокруг области отображения апплета.
      g.drawRect(0, 0, 
      getWidth() - 1,
      getHeight() - 1);

      // Отобразите строку внутри прямоугольника.
      g.drawString(strBuffer.toString(), 10, 20);
   }

   
   public void mouseEntered(MouseEvent event) {
   }
   public void mouseExited(MouseEvent event) {
   }
   public void mousePressed(MouseEvent event) {
   }
   public void mouseReleased(MouseEvent event) {
   }
   public void mouseClicked(MouseEvent event) {
      addItem("кнопка мышки нажата! ");
   }
}

Теперь давайте назовем этот апплет следующим образом:

<html>
   <title>Event Handling</title>
   <hr>
   <applet code = "ExampleEventHandling.class" 
      width = "300" height = "300">
   </applet>
   <hr>
</html>

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

Отображение изображений

Динамическая сетевая программа может отображать изображения в формате GIF, JPEG, BMP и других форматах. Чтобы отобразить изображение в апплете, вы используете метод drawImage() из класса java.awt.Graphics.

Ниже приведен пример, иллюстрирующий все шаги для отображения изображений.

import java.applet.*;
import java.awt.*;
import java.net.*;

public class ImageDemo extends Applet {
   private Image image;
   private AppletContext context;
   
   public void init() {
      context = this.getAppletContext();
      String imageURL = this.getParameter("изображение");
      if(imageURL == null) {
         imageURL = "java.webp";
      }
      try {
         URL url = new URL(this.getDocumentBase(), imageURL);
         image = context.getImage(url);
      } catch (MalformedURLException e) {
         e.printStackTrace();
         // Отобразите в строке состояния браузера
         context.showStatus("Не удалось загрузить изображение!");
      }
   }
   
   public void paint(Graphics g) {
      context.showStatus("Отображение изображения");
      g.drawImage(image, 0, 0, 200, 84, null);
      g.drawString("www.javalicense.com", 35, 100);
   }  
}

Теперь давайте назовем этот апплет следующим образом:

<html>
   <title>The ImageDemo applet</title>
   <hr>
   <applet code = "ImageDemo.class" width = "300" height = "200">
      <param name = "изображение" value = "java.webp">
   </applet>
   <hr>
</html>

Воспроизведение аудио

Динамическая сетевая программа может воспроизводить аудиофайл, представленный интерфейсом AudioClip в пакете java.applet. Интерфейс AudioClip имеет три метода, в том числе:

  • public void play() – воспроизводит аудиоклип один раз с самого начала.
  • public void loop() – вызывает непрерывное воспроизведение аудиоклипа.
  • public void stop() – останавливает воспроизведение аудиоклипа.

Чтобы получить объект AudioClip, необходимо вызвать метод getAudioClip() класса Applet. Метод getAudioClip() немедленно возвращается независимо от того, ссылается ли URL-адрес на фактический аудиофайл. Аудиофайл не загружается, пока не будет сделана попытка воспроизвести аудиоклип.

Ниже приведен пример, иллюстрирующий все шаги для воспроизведения звука.

import java.applet.*;
import java.awt.*;
import java.net.*;

public class AudioDemo extends Applet {
   private AudioClip clip;
   private AppletContext context;
   
   public void init() {
      context = this.getAppletContext();
      String audioURL = this.getParameter("аудио");
      if(audioURL == null) {
         audioURL = "default.au";
      }
      try {
         URL url = new URL(this.getDocumentBase(), audioURL);
         clip = context.getAudioClip(url);
      } catch (MalformedURLException e) {
         e.printStackTrace();
         context.showStatus("Не удалось загрузить аудиофайл!");
      }
   }
   
   public void start() {
      if(clip != null) {
         clip.loop();
      }
   }
   
   public void stop() {
      if(clip != null) {
         clip.stop();
      }
   }
}

Теперь давайте назовем этот апплет следующим образом:

<html>
   <title>The ImageDemo applet</title>
   <hr>
   <applet code = "ImageDemo.class" width = "0" height = "0">
      <param name = "аудио" value = "test.wav">
   </applet>
   <hr>
</html>

Вы можете использовать test.wav на своем ПК, чтобы проверить приведенный выше пример.

Оглавление