Java 小应用程序(Applet)是一种可以在 Web 浏览器中运行的 Java 程序。由于它拥有整个 Java API 的支持,因此它可以是一个功能完整的 Java 应用程序。
小应用程序与独立的 Java 应用程序之间存在一些重要的差异,包括但不限于以下几点:
-
小应用程序是一个继承自 java.applet.Applet
类的 Java 类。
-
不会在小应用程序上调用 main()
方法,并且小应用程序类不会定义 main()
方法。
-
-
当用户浏览包含小应用程序的 HTML 页面时,小应用程序的代码会被下载到用户的计算机上。
-
查看小应用程序需要一个 JVM(Java 虚拟机),这个 JVM 可以是 Web 浏览器的一个插件或是一个单独的运行环境。
-
用户计算机上的 JVM 会实例化小应用程序类并在小应用程序的生命周期期间调用各种方法。
-
小应用程序有严格的由 Web 浏览器强制执行的安全规则。小应用程序的安全性通常被称为沙盒安全模型,将小应用程序比作必须遵循某些规则才能玩耍的孩子。
-
小应用程序可能需要的其他类可以打包在一个单一的 Java 归档(JAR)文件中。
Java 小应用程序的生命期
Applet 类中的四个方法为你提供了构建任何严肃的小应用程序的基本框架:
-
init
— 此方法旨在处理小应用程序所需的所有初始化操作。在 <applet>
标签内的 param
标签被处理之后,会调用此方法。
-
start
— 此方法在浏览器调用 init
方法之后自动调用。当用户从其他页面返回包含小应用程序的页面时也会调用此方法。
-
stop
— 此方法在用户离开包含小应用程序的页面时自动调用。因此,同一个小应用程序中可能会反复调用此方法。
-
destroy
— 此方法仅在浏览器正常关闭时调用。因为小应用程序是设计用来生活在 HTML 页面上的,所以在用户离开含有小应用程序的页面后,你不应该留下任何资源。
-
paint
— 在 start()
方法之后立即调用,并且在任何时候小应用程序需要在浏览器中重新绘制自身时都会调用。paint()
方法实际上是从 java.awt
继承来的。
Java 小应用程序生命期的方法会自动调用。下图展示了小应用程序生命期的流程。
简单的 Java 小应用程序 “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
和 Graphics
类。
Applet 类
每个小应用程序都是 java.applet.Applet
类的扩展。基本的 Applet
类提供了派生的 Applet
类可以调用以从浏览器上下文中获取信息和服务的方法。
这些方法包括但不限于:
此外,Applet
类提供了一个接口,使得查看器或浏览器能够获取有关小应用程序的信息并控制小应用程序的执行。查看器可以:
Applet
类为这些方法提供了默认实现。根据需要,这些实现可以被重写。
“Hello, World” 小应用程序就目前而言是完整的。唯一重写的方法是 paint
方法。
调用小应用程序
可以通过在 HTML 文件中嵌入指令并通过小应用程序查看器或支持 Java 的浏览器查看该文件来调用小应用程序。
<applet>
标签是将小应用程序嵌入 HTML 文件的基础。下面是一个调用 “Hello, World” 小应用程序的例子:
<html>
<title>The Hello, World Applet</title>
<hr>
<applet code="HelloWorldApplet.class" width="320" height="120">
如果您的浏览器支持 Java,那么这里会出现一条 “Hello, World” 的信息。
</applet>
<hr>
</html>
注意,<applet>
标签的 code
属性是必需的。它指定了要运行的 Applet
类。宽度和高度也是必需的,以指定小应用程序运行时面板的初始大小。小应用程序指令必须使用 </applet>
标签闭合。
如果小应用程序需要参数,可以通过在 <applet>
和 </applet>
之间添加 <param>
标签来传递参数值。非 Java 支持的浏览器不会处理 <applet>
和 </applet>
。因此,出现在这些标签之间的所有非小应用程序相关的内容在非 Java 支持的浏览器中可见。
如果小应用程序位于默认包之外的某个包中,则必须使用点字符(.
)来分隔包/类组件,从而在 code
属性中指定持有包。
获取小应用程序参数
下面的例子演示了如何让一个小应用程序响应文档中指定的设置参数。这个小应用程序显示了一种黑白相间的棋盘模式。
第二种颜色和每个方格的大小可以作为参数指定给小应用程序。
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
的 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) {
}
}
小应用程序调用 parseSquareSize()
来解析 squareSize
参数。parseSquareSize()
调用库方法 Integer.parseInt()
,该方法解析字符串并返回一个整数。Integer.parseInt()
在其参数无效时会抛出异常。
因此,parseSquareSize()
捕获异常,而不是允许小应用程序在输入错误时失败。
小应用程序调用 parseColor()
将颜色参数解析成 Color
值。parseColor()
执行一系列字符串比较以匹配参数值与预定义颜色的名称。你需要实现这些方法才能使这个小应用程序工作。