Java - основы работы с апплетами

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

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

  • Апплет - это класс Java, расширяющий класс java.applet.Applet.

  • Метод main () не вызывается в апплете, и класс апплета не определяет main ().

  • Апплеты предназначены для встраивания в HTML-страницу.

  • Когда пользователь просматривает HTML-страницу, содержащую апплет, код апплета загружается на компьютер пользователя.

  • Для просмотра апплета требуется JVM. JVM может быть либо подключаемым модулем веб-браузера, либо отдельной средой выполнения.

  • JVM на машине пользователя создает экземпляр класса апплета и вызывает различные методы в течение срока службы апплета.

  • Апплеты имеют строгие правила безопасности, соблюдение которых обеспечивается веб-браузером. Безопасность апплета часто называют безопасностью песочницы, когда апплет сравнивают с дочерним элементом, играющим в песочнице, с различными правилами, которые необходимо соблюдать.

  • Другие классы, которые нужны апплету, можно загрузить в одном файле архива Java (JAR).

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

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

  • init- Этот метод предназначен для любой инициализации, необходимой для вашего апплета. Он вызывается после обработки тегов параметров внутри тега апплета.

  • start- Этот метод автоматически вызывается после того, как браузер вызывает метод init. Он также вызывается всякий раз, когда пользователь возвращается на страницу, содержащую апплет, после перехода на другие страницы.

  • stop- Этот метод автоматически вызывается, когда пользователь уходит со страницы, на которой находится апплет. Следовательно, его можно вызывать повторно в одном и том же апплете.

  • destroy- Этот метод вызывается только при нормальном завершении работы браузера. Поскольку апплеты предназначены для размещения на HTML-странице, обычно не следует оставлять ресурсы после того, как пользователь покинет страницу, содержащую апплет.

  • paint- Вызывается сразу после метода start (), а также каждый раз, когда апплету необходимо перерисовать себя в браузере. Метод paint () фактически унаследован от java.awt.

Аплет "Hello, World"

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

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

public class HelloWorldApplet extends Applet {
   public void paint (Graphics g) {
      g.drawString ("Hello World", 25, 50);
   }
}

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

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

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

Класс апплета

Каждый апплет является расширением класса java.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">
      If your browser was Java-enabled, a "Hello, World"
      message would appear here.
   </applet>
   <hr>
</html>

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

Атрибут code тега <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;   // initialized to default size
   public void init() {}
   private void parseSquareSize (String param) {}
   private Color parseColor (String param) {}
   public void paint (Graphics g) {}
}

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

public void init () {
   String squareSizeParam = getParameter ("squareSize");
   parseSquareSize (squareSizeParam);
   
   String colorParam = getParameter ("color");
   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) {
      // Let default value remain
   }
}

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

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

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

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

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

<html>
   <title>Checkerboard Applet</title>
   <hr>
   <applet code = "CheckerApplet.class" width = "480" height = "320">
      <param name = "color" value = "blue">
      <param name = "squaresize" value = "30">
   </applet>
   <hr>
</html>

Note - Имена параметров не чувствительны к регистру.

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

Графическое приложение Java (то есть приложение, которое использует AWT и которое можно запускать с помощью средства запуска программ 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("initializing the apple ");
   }

   public void start() {
      addItem("starting the applet ");
   }

   public void stop() {
      addItem("stopping the applet ");
   }

   public void destroy() {
      addItem("unloading the applet");
   }

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

   public void paint(Graphics g) {
      // Draw a Rectangle around the applet's display area.
      g.drawRect(0, 0, 
      getWidth() - 1,
      getHeight() - 1);

      // display the string inside the rectangle.
      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("mouse clicked! ");
   }
}

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

<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("image");
      if(imageURL == null) {
         imageURL = "java.jpg";
      }
      try {
         URL url = new URL(this.getDocumentBase(), imageURL);
         image = context.getImage(url);
      } catch (MalformedURLException e) {
         e.printStackTrace();
         // Display in browser status bar
         context.showStatus("Could not load image!");
      }
   }
   
   public void paint(Graphics g) {
      context.showStatus("Displaying image");
      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 = "image" value = "java.jpg">
   </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("audio");
      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("Could not load audio file!");
      }
   }
   
   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 = "audio" value = "test.wav">
   </applet>
   <hr>
</html>

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