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.Appletjavax.swing.JApplet。它的核心价值在于:

  1. 跨平台性:一次编写,可在所有支持 Java 的浏览器上运行
  2. 即时性:无需本地安装,打开网页即可启动
  3. 轻量化:专注于特定功能,资源占用较低

但需注意,由于安全性和现代网页技术(如 HTML5)的演进,Java Applet 已逐渐退出主流应用场景。本文旨在帮助开发者理解其基础原理,为历史项目维护或特殊场景提供技术参考。


Java Applet 的核心概念与生命周期

1. 基本类与继承关系

所有 Java Applet 必须继承自 AppletJApplet 类:

  • 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. 网络通信能力

通过 URLURLConnection 实现简单网络请求:

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);
    }
}

关键点解析

  1. 线程管理:在 start() 中创建更新线程,在 stop() 中中断线程,确保资源释放
  2. 时间格式化:通过 Date 对象获取当前时间,截取并拆分字符串
  3. 色彩区分:使用 setColor() 方法为不同字段设置颜色

挑战与解决方案

常见问题及应对策略

1. 安全限制导致功能受限

场景:尝试读取本地文件时触发安全异常
解决方案

  • 通过数字签名获得用户授权
  • 将敏感操作迁移到服务器端处理

2. 跨浏览器兼容性问题

现象:某些浏览器无法显示 Applet
解决方法

  • 提示用户安装 Java 插件
  • 提供替代方案(如 WebAssembly)

3. 性能优化需求

问题:复杂计算导致界面卡顿
优化方案

  • 减少 repaint() 调用频率
  • 使用双缓冲技术(JApplet 内置支持)

结论

Java Applet 作为 Java 技术早期的重要实践,虽然在当今 Web 开发中已不再是主流选择,但其核心设计理念和实现机制仍具有重要参考价值。通过本文的学习,开发者可以:

  • 理解 Applet 的生命周期与安全模型
  • 掌握基础开发流程与图形交互技巧
  • 在特定场景下(如企业内部系统、历史项目维护)灵活应用

随着技术发展,建议将新项目转向更现代的解决方案(如 WebAssembly、Canvas 或纯 JavaScript),但 Java Applet 的学习过程能帮助开发者更深入理解:

  • 跨平台技术实现原理
  • 沙箱环境的安全机制
  • 浏览器与本地代码的交互逻辑

掌握这些底层逻辑,将为后续学习其他技术栈提供宝贵认知框架。

最新发布