Java 简明教程

Java - Applet Basics

一个 applet 是一个在 Web 浏览器中运行的 Java 程序。小应用程序可以是一个功能齐全的 Java 应用程序,因为它可以使用整个 Java API。

小应用程序与独立 Java 应用程序之间有一些重要的区别,包括以下区别 −

  1. 小应用程序是一个 Java class ,它扩展了 java.applet.Applet 类。

  2. 不会在小应用程序上调用 main() 方法,而小应用程序类不会定义 main()

  3. 小应用程序设计为嵌入在 HTML 页面中。

  4. 当用户查看包含小应用程序的 HTML 页面时,小应用程序的代码将下载到用户计算机上。

  5. 需要使用 JVM 才能查看一个小应用程序。JVM 可以是 Web 浏览器的插件或一个独立的运行时环境。

  6. 用户计算机上的 JVM 会创建小应用程序类的实例,并在小应用程序的生命期内调用各种方法。

  7. 小应用程序有 Web 浏览器强制实施的严格安全规则。小应用程序的安全性通常称为沙盒安全性,将小应用程序比作在沙盒中玩耍的孩子,必须遵循各种规则。

  8. 小应用程序需要的其他类可以下载到一个 Java 归档 (JAR) 文件中。

Life Cycle of an Applet in Java

Applet 类中的四种方法为你提供了构建任何重要小程序的基础架构 −

  1. init− 此方法打算用于小程序所需的任何初始化。它在处理小程序标签中的参数标签之后调用。

  2. start− 在浏览器调用 init 方法后,会自动调用此方法。每当用户浏览其他页面后返回包含小程序的页面时,也会调用此方法。

  3. stop− 当用户离开放置小程序的页面时,会自动调用此方法。因此,在同一小程序中可以反复调用此方法。

  4. destroy− 仅在浏览器正常关闭时调用此方法。由于小程序旨在包含在 HTML 页面中,因此当用户离开包含小程序的页面后,通常不应留下资源。

  5. paint− 在 start() 方法之后立即调用,以及每次小程序需要在浏览器中自行重新绘制时调用。paint() 方法实际上是从 java.awt. 那里继承的。

Flow of Java Applet Life Cycle

小程序生命周期方法会自动调用。下图显示了小程序生命周期的流程。

java applet life cycle

A Simple Java Applet "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);
   }
}

这些导入语句将类引入到小程序类的范围内 −

  1. java.applet.Applet

  2. java.awt.Graphics

如果没有这些 import 语句,则 Java compiler 将无法识别小应用程序类所引用的 Applet 和 Graphics 类。

The Applet Class

每个小程序都是 java.applet.Applet 类的扩展。基本 Applet 类提供了派生小程序类可以调用的方法,以从浏览器环境获取信息和服务。

其中包括执行以下操作的方法 −

  1. Get applet parameters

  2. 获取包含小程序的 HTML 文件的网络位置

  3. 获取小程序类目录的网络位置

  4. 在浏览器中打印一个状态消息

  5. Fetch an image

  6. Fetch an audio clip

  7. Play an audio clip

  8. Resize the applet

此外,Applet 类还提供了一个接口,供查看器或浏览器获取有关小程序的信息并控制小程序的执行。查看器可以 −

  1. 请求有关小程序作者、版本和版权的信息

  2. 请求对小程序识别的参数的描述

  3. Initialize the applet

  4. Destroy the applet

  5. Start the applet’s execution

  6. Stop the applet’s execution

Applet 类为每种方法提供默认实现。可以根据需要覆盖这些实现。

“Hello, World”小程序在当前状态下是完整的。唯一被覆盖的方法是 paint 方法。

Invoking an Applet

可以通过将指令嵌入 HTML 文件并在小程序查看器或支持 Java 的浏览器中查看该文件来调用小程序。

<applet> tag 是将一个小应用程序嵌入 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 Applet Tag 以详细了解如何从 HTML 中调用小应用程序。

<applet> 标签的 code 属性是必需的。它指定要运行的 Applet 类。还要求宽度和高度来指定小程序运行的面板的初始大小。小程序指令必须使用 </applet> 标签关闭。

如果小程序带有参数,可以通过在 <applet> 和 </applet> 之间添加 <param> 标签来传递参数值。该浏览器将忽略 applet 标签之间的文本和其他标签。

不支持 Java 的浏览器不会处理 <applet> 和 </applet>。因此,标签之间的任何内容都与该小程序无关,并且在不支持 Java 的浏览器中是可见的。

该查看器或浏览器在文档位置查找已编译的 Java 代码。若要另行指定,请使用 <applet> 标签的 codebase 属性,如以下代码所示:

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

如果小程序位于其他包中,而且不是默认包,则必须使用句点 (.) 来分隔包/类组件,并通过 code 属性来指定包含的包。例如:

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

Getting Applet Parameters

以下示例演示如何让小程序响应文档中指定的设置参数。该小程序显示黑白相间的棋盘格图案。

可以在文档中将第二种颜色和每个正方形的大小指定为小程序的参数。

CheckerApplet 在 init() 方法中获取其参数。它还可以在 paint() 方法中获取其参数。但是,在 applet 开始时获取值并保存设置(而不是每次刷新时),是方便且有效的。

小程序查看器或浏览器调用它运行的每个小程序的 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) {}
}

以下是 CheckerApplet 的 init() 和私有 parseSquareSize() 方法:

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 参数解析为 Color 值。parseColor() 执行一系列字符串比较,以将参数值与预定义颜色的名称匹配。您需要实现这些方法才能使此小程序工作。

Specifying Applet Parameters

以下是其中嵌入 CheckerApplet 的 HTML 文件的示例。该 HTML 文件通过 <param> 标签指定小程序的两个参数。

Example

<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 - 参数名称不区分大小写。

Application Conversion to Applets

将图形 Java 应用程序(即使用 AWT、并且可以使用 Java 程序启动器启动的应用程序)很容易转换为可嵌入到网页中的小程序。

以下是将应用程序转换为小程序的具体步骤。

  1. 通过适当的标签创建一个 HTML 页面,用于加载小程序代码。

  2. 提供 JApplet 类的一个子类。将此类设为公有。否则,小应用程序无法加载。

  3. 消除应用程序中的主方法。不要为应用程序构建框架窗口。您的应用程序将在浏览器中显示。

  4. 把框架窗口构造函数中的任何初始化代码移到该小应用程序的初始化方法中。您不需要明确构建小应用程序对象。浏览器会为您实例化它并调用初始化方法。

  5. 移除对 setSize 的调用;对于小应用程序,大小使用 HTML 文件中的宽度和高度参数来设定。

  6. 移除对 setDefaultCloseOperation 的调用。小应用程序无法被关闭;它会在浏览器退出时终止。

  7. 如果应用程序调用 setTitle,请消除对该方法的调用。小应用程序不能有标题栏。(您当然可以使用 HTML title 标记为网页本身命名。)

  8. 不要调用 setVisible(true)。小应用程序会自动显示。

Event Handling

小应用程序从 Container 类继承一组事件处理方法。Container 类定义了一些方法(如处理特定类型事件的 processKeyEvent 和 processMouseEvent)以及一个通用方法 processEvent。

为了对事件做出反应,需要覆盖适当的事件特定方法。

Example

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>

最初,小应用程序将显示“初始化小应用程序。正在启动小应用程序。”然后,一旦您点击矩形内的某个位置,“鼠标已点击”也将显示出来。

Displaying Images

小应用程序可以显示 GIF、JPEG、BMP 等格式的图像。若要在小应用程序内显示图像,请使用 java.awt.Graphics 类提供的 drawImage() 方法。

以下是说明显示图像的所有步骤的一个示例 −

Example

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>

Playing Audio

小应用程序可以播放由 java.applet 包中的 AudioClip 接口表示的音频文件。AudioClip 接口有三个方法,包括 −

  1. public void play() - 从头开始播放音频片段一次。

  2. public void loop() - 使音频片段连续播放。

  3. public void stop() - 停止播放音频片段。

要获取 AudioClip 对象,您必须调用 Applet 类的 getAudioClip() 方法。getAudioClip() 方法会立即返回,而不管 URL 是否解析为实际的音频文件。只有在尝试播放音频片段时才会下载音频文件。

以下是说明播放音频的所有步骤的一个示例 −

Example

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>

可在您的 PC 上使用 test.wav 测试上述示例。