Java Applet 基础(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
什么是 Java Applet?
Java Applet 是 Java 技术生态中一种特殊的程序类型,它最初设计用于在网页浏览器中运行小型、交互式的应用程序。通过嵌入 HTML 页面,用户无需下载即可直接在浏览器内体验丰富的图形化功能。可以将其想象为“网页上的小程序”,类似乐高积木般灵活拼接,但受限于浏览器的安全沙箱环境。
从技术角度,Java Applet 是 Java 类的子类,继承自 java.applet.Applet
或 javax.swing.JApplet
。它的核心价值在于:
- 跨平台性:一次编写,可在所有支持 Java 的浏览器上运行
- 即时性:无需本地安装,打开网页即可启动
- 轻量化:专注于特定功能,资源占用较低
但需注意,由于安全性和现代网页技术(如 HTML5)的演进,Java Applet 已逐渐退出主流应用场景。本文旨在帮助开发者理解其基础原理,为历史项目维护或特殊场景提供技术参考。
Java Applet 的核心概念与生命周期
1. 基本类与继承关系
所有 Java Applet 必须继承自 Applet
或 JApplet
类:
java.applet.Applet
:基础类,提供基本图形绘制能力javax.swing.JApplet
:基于 Swing 框架,支持更复杂的界面组件
继承示例:
import java.applet.Applet;
import java.awt.Graphics;
public class HelloWorld extends Applet {
public void paint(Graphics g) {
g.drawString("Hello Java Applet!", 20, 20);
}
}
2. 生命周期方法
Applet 的运行遵循严格的生命周期,包含四个核心方法:
方法名 | 触发时机 | 作用描述 |
---|---|---|
init() | Applet 被创建时调用一次 | 初始化资源(如加载图像、数据) |
start() | Applet 被显示时调用 | 开始执行逻辑(如启动动画循环) |
stop() | Applet 被隐藏或浏览器导航时 | 暂停资源消耗(如停止计时器) |
destroy() | Applet 被销毁前调用 | 释放所有资源(如关闭数据库连接) |
生命周期比喻:
可将其理解为生物的生长过程:init()
是出生时的器官形成,start()
相当于开始呼吸,stop()
是进入休眠,destroy()
则是自然死亡过程。
3. 安全机制与限制
由于运行在浏览器环境中,Java Applet 遵循严格的安全策略:
- 沙箱限制:默认无法访问本地文件系统或网络
- 数字签名:需经过证书认证才能突破限制
- 浏览器兼容性:需用户手动启用 Java 插件
这一机制如同给 Applet 套上“防护罩”,既保护用户设备安全,也限制了其功能边界。
开发 Java Applet 的完整流程
1. 开发环境配置
需要准备以下工具:
- JDK 8 或更高版本(注意:JDK 11+ 已移除 Applet 支持)
- 任意 Java IDE(如 IntelliJ IDEA、Eclipse)
- 文本编辑器(用于编写 HTML)
2. 编写基础示例
步骤 1:创建 Applet 类
import java.applet.Applet;
import java.awt.Graphics;
public class MyFirstApplet extends Applet {
// 生命周期方法实现
public void init() {
System.out.println("Applet 初始化完成");
}
public void start() {
System.out.println("Applet 开始运行");
}
public void stop() {
System.out.println("Applet 暂停运行");
}
public void destroy() {
System.out.println("Applet 被销毁");
}
// 图形绘制方法
public void paint(Graphics g) {
g.drawString("欢迎学习 Java Applet", 50, 50);
}
}
步骤 2:生成字节码文件
通过命令行编译:
javac MyFirstApplet.java
步骤 3:编写 HTML 容器
创建 applet.html
文件,内容如下:
<html>
<head><title>Java Applet 示例</title></head>
<body>
<applet code="MyFirstApplet.class" width="300" height="200"></applet>
</body>
</html>
步骤 4:部署与测试
- 将编译后的
.class
文件与 HTML 文件放在同一目录 - 使用支持 Java 的浏览器(如旧版 Chrome + NPAPI 插件)打开 HTML 文件
进阶特性详解
1. 图形绘制与动画实现
通过 Graphics
对象可绘制复杂图形:
public void paint(Graphics g) {
// 设置绘制颜色
g.setColor(Color.BLUE);
// 绘制矩形
g.drawRect(10, 10, 100, 50);
// 填充圆形
g.fillOval(150, 150, 50, 50);
}
动画实现技巧:
结合 start()
/stop()
方法与 Thread
实现循环动画:
private Thread animationThread;
public void start() {
animationThread = new Thread(() -> {
while (true) {
// 更新状态
repaint(); // 触发 paint() 重绘
try { Thread.sleep(50); } catch (InterruptedException e) {}
}
});
animationThread.start();
}
2. 事件处理与用户交互
通过继承 JApplet
可添加按钮、文本框等组件:
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
public class InteractiveApplet extends JApplet {
private JLabel label = new JLabel("点击按钮查看变化");
public void init() {
JButton button = new JButton("点击我");
button.addActionListener(e -> {
label.setText("按钮已被点击!");
});
add(label);
add(button);
}
}
3. 网络通信能力
通过 URL
和 URLConnection
实现简单网络请求:
public void init() {
try {
URL url = new URL("http://example.com/api/data");
URLConnection connection = url.openConnection();
BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream())
);
String response = reader.readLine();
// 处理响应数据
} catch (IOException e) {
e.printStackTrace();
}
}
实战案例:数字时钟 Applet
需求描述
创建一个显示当前时间的 Applet,每秒自动更新,并用不同颜色区分时、分、秒。
实现代码
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;
import java.util.Date;
public class DigitalClock extends Applet {
private Thread updateThread;
private Date currentTime = new Date();
public void start() {
updateThread = new Thread(() -> {
while (true) {
currentTime = new Date();
repaint();
try { Thread.sleep(1000); } catch (InterruptedException e) {}
}
});
updateThread.start();
}
public void stop() {
updateThread.interrupt();
}
public void paint(Graphics g) {
String time = currentTime.toString().substring(11, 19);
String[] parts = time.split(":");
g.setColor(Color.RED);
g.drawString(parts[0], 20, 40);
g.setColor(Color.BLUE);
g.drawString(parts[1], 80, 40);
g.setColor(Color.GREEN);
g.drawString(parts[2], 140, 40);
}
}
关键点解析
- 线程管理:在
start()
中创建更新线程,在stop()
中中断线程,确保资源释放 - 时间格式化:通过
Date
对象获取当前时间,截取并拆分字符串 - 色彩区分:使用
setColor()
方法为不同字段设置颜色
挑战与解决方案
常见问题及应对策略
1. 安全限制导致功能受限
场景:尝试读取本地文件时触发安全异常
解决方案:
- 通过数字签名获得用户授权
- 将敏感操作迁移到服务器端处理
2. 跨浏览器兼容性问题
现象:某些浏览器无法显示 Applet
解决方法:
- 提示用户安装 Java 插件
- 提供替代方案(如 WebAssembly)
3. 性能优化需求
问题:复杂计算导致界面卡顿
优化方案:
- 减少
repaint()
调用频率 - 使用双缓冲技术(
JApplet
内置支持)
结论
Java Applet 作为 Java 技术早期的重要实践,虽然在当今 Web 开发中已不再是主流选择,但其核心设计理念和实现机制仍具有重要参考价值。通过本文的学习,开发者可以:
- 理解 Applet 的生命周期与安全模型
- 掌握基础开发流程与图形交互技巧
- 在特定场景下(如企业内部系统、历史项目维护)灵活应用
随着技术发展,建议将新项目转向更现代的解决方案(如 WebAssembly、Canvas 或纯 JavaScript),但 Java Applet 的学习过程能帮助开发者更深入理解:
- 跨平台技术实现原理
- 沙箱环境的安全机制
- 浏览器与本地代码的交互逻辑
掌握这些底层逻辑,将为后续学习其他技术栈提供宝贵认知框架。