一个非常重要的现实提醒:

Java Applet 技术已经过时,并且在现代浏览器中被完全弃用。 从 Java 9 开始,Applet API 被标记为 deprecated(不推荐使用),并在 Java 11 中被正式移除,主流的现代浏览器(如 Chrome, Firefox, Edge, Safari)早已不再支持 Java 插件,因此无法再运行 Applet。
尽管如此,学习 Java Applet 仍然有其价值:
- 历史意义:它是 Java 语言早期“一次编写,到处运行”(Write Once, Run Anywhere)愿景的第一次伟大实践。
- 教学价值:对于初学者来说,它是一个理解 Java GUI 编程、事件处理、以及浏览器与客户端程序交互原理的绝佳入门模型。
- 遗留系统维护:在一些非常古老的企业内部系统中可能仍在使用,了解其原理有助于维护。
什么是 Java Applet?
Java Applet 是一个用 Java 编写的小型应用程序,它被嵌入到 HTML 页面中,并在用户的 Web 浏览器中运行,与在服务器端运行的 Servlet 不同,Applet 在客户端(用户的机器上)执行,这使得它能够提供丰富的交互式用户体验,例如动画、游戏、复杂的图形计算等。
主要特点:

- 浏览器内运行:需要支持 Java 插件的浏览器。
- 沙箱安全模型:为了安全,Applet 运行在一个受限的“沙箱”环境中,默认情况下无法访问本地文件系统、网络(除原始服务器外)等敏感资源。
- 生命周期:有明确的
init(),start(),stop(),destroy()生命周期方法。 - GUI 组件:主要使用 AWT (Abstract Window Toolkit) 组件来构建用户界面。
开发一个简单的 Java Applet (示例)
下面我们将通过一个经典的 "Hello, World!" Applet 示例,来走一遍完整的开发流程。
环境准备
由于现代浏览器不支持,我们需要一个特殊的浏览器或Applet 查看器来测试,最简单的方法是使用 Eclipse IDE,它内置了 Applet 查看器。
- 安装 Eclipse for Java Developers。
- 在 Eclipse 中,确保你的项目是 "Java Applet" 项目类型,或者是一个普通的 Java 项目,但我们将以 Applet 的方式运行它。
编写 Applet 代码
创建一个 Java 类,继承自 java.applet.Applet。
HelloApplet.java

import java.applet.Applet;
import java.awt.Graphics; // 导入 Graphics 类用于绘图
/**
* 一个简单的 "Hello, World!" Applet
*/
public class HelloApplet extends Applet {
// Applet 的初始化方法,当 Applet 首次加载时调用,只调用一次
@Override
public void init() {
System.out.println("Applet 正在初始化...");
// 可以在这里进行一些初始化设置,比如设置背景色
// this.setBackground(Color.YELLOW);
}
// Applet 的启动方法,当 Applet 可见且准备开始运行时调用
@Override
public void start() {
System.out.println("Applet 正在启动...");
}
// Applet 的绘制方法,当 Applet 需要重绘自身时调用(如窗口大小改变、被其他窗口遮挡后重新显示)
// 这是 Applet 的核心方法,用于在屏幕上绘制内容
@Override
public void paint(Graphics g) {
// g 是 Graphics 对象,它是一个“画笔”,用于在 Applet 区域上绘制
g.drawString("Hello, World from Applet!", 50, 25);
}
// Applet 的停止方法,当 Applet 变得不可见时调用(用户导航到了另一个页面)
@Override
public void stop() {
System.out.println("Applet 正在停止...");
}
// Applet 的销毁方法,当 Applet 从浏览器中卸载时调用,只调用一次
@Override
public void destroy() {
System.out.println("Applet 正在销毁...");
}
}
编写 HTML 页面来嵌入 Applet
创建一个 HTML 文件,使用 <applet> 标签来告诉浏览器加载和运行哪个 Java 类。
index.html
<!DOCTYPE html>
<html>
<head>My First Applet</title>
</head>
<body>
<h1>这是一个 Java Applet 示例</h1>
<!--
<applet> 标签用于嵌入 Applet
code: 指定编译后的 .class 文件名
width: Applet 显示区域的宽度(像素)
height: Applet 显示区域的高度(像素)
-->
<applet code="HelloApplet.class" width="300" height="100">
<!--
如果用户的浏览器不支持 Java,将显示这里的替代文本。
注意:<applet> 标签在 HTML5 中已不被推荐,但为了兼容旧的 Applet 仍然使用。
-->
您的浏览器不支持 Java Applet,或者没有安装 Java 插件。
</applet>
</body>
</html>
编译和运行
- 编译:在 Eclipse 中,右键点击
HelloApplet.java文件,选择 "Run As" -> "Java Applet",Eclipse 会自动编译你的代码。 - 运行:Eclipse 会启动其内置的 Applet 查看器,并加载你的 HTML 文件,你会看到一个窗口,其中显示了 "Hello, World from Applet!"。
如果你使用命令行:
# 编译 Java 文件 javac HelloApplet.java # 使用 appletviewer 工具来运行 HTML 文件 # appletviewer 是 JDK 自带的命令行工具,专门用于测试 Applet appletviewer index.html
Applet 的生命周期
理解 Applet 的生命周期对于开发复杂的 Applet 至关重要,浏览器通过调用 Applet 类中的特定方法来管理其生命周期:
-
init()- 何时调用:当 Applet 类被第一次加载到浏览器中时。
- 调用次数:仅一次。
- 用途:执行一次性的初始化操作,如设置初始参数、加载图片或声音等。
-
start()- 何时调用:在
init()调用之后,以及每次 Applet 变得可见时(用户从另一个页面返回包含 Applet 的页面)。 - 调用次数:可被调用多次。
- 用途:启动或重新启动 Applet 的执行逻辑,启动一个动画循环。
- 何时调用:在
-
paint(Graphics g)- 何时调用:当 Applet 需要在屏幕上绘制自身时,这发生在以下情况:
- Applet 首次变得可见。
- Applet 的窗口被覆盖后重新显露。
- 调用了
repaint()方法。
- 调用次数:可被调用多次。
- 用途:使用
Graphics对象绘制 Applet 的内容(文本、图形、图像等)。
- 何时调用:当 Applet 需要在屏幕上绘制自身时,这发生在以下情况:
-
stop()- 何时调用:当 Applet 变得不可见时(用户导航到另一个网页,或最小化浏览器窗口)。
- 调用次数:可被调用多次。
- 用途:暂停 Applet 的执行,以节省资源,停止动画循环。
-
destroy()- 何时调用:当浏览器完全关闭或卸载包含 Applet 的页面时。
- 调用次数:仅一次。
- 用途:执行清理操作,释放所有占用的资源,如关闭网络连接、删除创建的临时文件等。
更复杂的 Applet 示例:带交互和绘图
让我们创建一个更复杂的 Applet,它响应鼠标点击,并在点击位置绘制一个彩色的圆。
DrawingApplet.java
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*; // 导入事件处理包
public class DrawingApplet extends Applet implements MouseListener {
// 声明一个 Graphics 对象,用于在 paint 方法中使用
private Graphics g;
@Override
public void init() {
// 注册当前对象为鼠标事件的监听器
addMouseListener(this);
setBackground(Color.WHITE);
}
@Override
public void paint(Graphics g) {
this.g = g; // 保存 Graphics 对象的引用
g.setColor(Color.BLACK);
g.drawString("请在 Applet 区域点击鼠标来画圆", 10, 20);
}
// --- MouseListener 接口的方法 ---
@Override
public void mouseClicked(MouseEvent e) {
// 当鼠标点击时被调用
int x = e.getX();
int y = e.getY();
// 随机生成一个颜色
Color randomColor = new Color((float)Math.random(), (float)Math.random(), (float)Math.random());
g.setColor(randomColor);
// 在点击位置画一个半径为 20 的圆
g.fillOval(x - 20, y - 20, 40, 40);
}
// 以下方法是 MouseListener 接口要求的,即使不使用也必须实现
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
}
对应的 HTML (drawing.html):
<applet code="DrawingApplet.class" width="500" height="400">
您的浏览器不支持 Java Applet。
</applet>
这个例子展示了:
- 实现事件监听器接口:
implements MouseListener。 - 注册监听器:
addMouseListener(this)。 - 事件处理:在
mouseClicked方法中获取鼠标坐标并绘制图形。 - 动态绘制:每次点击都会导致
paint方法被隐式调用(实际上是repaint),从而更新显示。
安全限制与权限
Applet 的“沙箱”是其安全性的核心,默认情况下,Applet 不能:
- 读取或写入客户端的本地文件系统。
- 运行客户端的任何程序。
- 打开除 Applet 所在服务器之外的任何网络连接。
- 访问系统属性(如用户名、操作系统版本等)。
Applet 需要突破这些限制,它必须被签名,签名过程涉及到数字证书,告诉浏览器这个 Applet 的来源是可信的,并请求用户授予额外的权限,这是一个复杂且涉及安全性的过程,在 Applet 时代是高级开发者的必备技能。
现代替代方案
由于 Applet 的消亡,如今要实现类似的功能,开发者会使用以下技术:
- Web 技术 (HTML, CSS, JavaScript):这是目前的主流,利用 Canvas API, WebGL, SVG 以及各种前端框架(如 React, Vue)可以实现极其丰富和复杂的交互式应用,无需任何插件。
- Java Web Start (JWS):这是 Sun(现在是 Oracle)推出的 Applet 的替代品,它允许用户从网页下载并启动一个完整的 Java 桌面应用程序,JWS 应用程序拥有与普通桌面应用相同的权限,但需要用户手动确认下载和安装,JWS 也已随 Java 11 被移除。
- JavaFX:是 Java 官方推荐的现代化图形用户界面工具包,你可以用 JavaFX 开发桌面应用,然后将其打包成 可执行文件(.jar, .exe, .dmg, .rpm 等) 供用户下载运行,或者将其嵌入到网页中(尽管浏览器支持度有限,且未来也不明朗),JavaFX 是 Java GUI 的未来方向。
| 特性 | Java Applet | 现代替代方案 |
|---|---|---|
| 运行环境 | 浏览器(需要 Java 插件) | 浏览器(Web技术)、桌面(可执行文件) |
| 技术栈 | Java, AWT/Swing | HTML, CSS, JavaScript, JavaFX |
| 部署方式 | 嵌入 HTML | 部署到 Web 服务器、应用商店 |
| 安全性 | 沙箱模型,严格受限 | 同源策略,可通过 HTTPS 增强安全 |
| 现状 | 已过时,被弃用 | 主流和推荐 |
学习 Java Applet 是一段很有趣的旅程,它能让你窥见 Java 早期发展的辉煌,但对于任何新的项目,请务必选择现代、主流且被广泛支持的技术。
