杰瑞科技汇

java applet 开发

一个非常重要的现实提醒

java applet 开发-图1
(图片来源网络,侵删)

Java Applet 技术已经过时,并且在现代浏览器中被完全弃用。 从 Java 9 开始,Applet API 被标记为 deprecated(不推荐使用),并在 Java 11 中被正式移除,主流的现代浏览器(如 Chrome, Firefox, Edge, Safari)早已不再支持 Java 插件,因此无法再运行 Applet。

尽管如此,学习 Java Applet 仍然有其价值:

  1. 历史意义:它是 Java 语言早期“一次编写,到处运行”(Write Once, Run Anywhere)愿景的第一次伟大实践。
  2. 教学价值:对于初学者来说,它是一个理解 Java GUI 编程、事件处理、以及浏览器与客户端程序交互原理的绝佳入门模型。
  3. 遗留系统维护:在一些非常古老的企业内部系统中可能仍在使用,了解其原理有助于维护。

什么是 Java Applet?

Java Applet 是一个用 Java 编写的小型应用程序,它被嵌入到 HTML 页面中,并在用户的 Web 浏览器中运行,与在服务器端运行的 Servlet 不同,Applet 在客户端(用户的机器上)执行,这使得它能够提供丰富的交互式用户体验,例如动画、游戏、复杂的图形计算等。

主要特点:

java applet 开发-图2
(图片来源网络,侵删)
  • 浏览器内运行:需要支持 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

java applet 开发-图3
(图片来源网络,侵删)
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>

编译和运行

  1. 编译:在 Eclipse 中,右键点击 HelloApplet.java 文件,选择 "Run As" -> "Java Applet",Eclipse 会自动编译你的代码。
  2. 运行:Eclipse 会启动其内置的 Applet 查看器,并加载你的 HTML 文件,你会看到一个窗口,其中显示了 "Hello, World from Applet!"。

如果你使用命令行:

# 编译 Java 文件
javac HelloApplet.java
# 使用 appletviewer 工具来运行 HTML 文件
# appletviewer 是 JDK 自带的命令行工具,专门用于测试 Applet
appletviewer index.html

Applet 的生命周期

理解 Applet 的生命周期对于开发复杂的 Applet 至关重要,浏览器通过调用 Applet 类中的特定方法来管理其生命周期:

  1. init()

    • 何时调用:当 Applet 类被第一次加载到浏览器中时。
    • 调用次数:仅一次。
    • 用途:执行一次性的初始化操作,如设置初始参数、加载图片或声音等。
  2. start()

    • 何时调用:在 init() 调用之后,以及每次 Applet 变得可见时(用户从另一个页面返回包含 Applet 的页面)。
    • 调用次数:可被调用多次。
    • 用途:启动或重新启动 Applet 的执行逻辑,启动一个动画循环。
  3. paint(Graphics g)

    • 何时调用:当 Applet 需要在屏幕上绘制自身时,这发生在以下情况:
      • Applet 首次变得可见。
      • Applet 的窗口被覆盖后重新显露。
      • 调用了 repaint() 方法。
    • 调用次数:可被调用多次。
    • 用途:使用 Graphics 对象绘制 Applet 的内容(文本、图形、图像等)。
  4. stop()

    • 何时调用:当 Applet 变得不可见时(用户导航到另一个网页,或最小化浏览器窗口)。
    • 调用次数:可被调用多次。
    • 用途:暂停 Applet 的执行,以节省资源,停止动画循环。
  5. 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 的消亡,如今要实现类似的功能,开发者会使用以下技术:

  1. Web 技术 (HTML, CSS, JavaScript):这是目前的主流,利用 Canvas API, WebGL, SVG 以及各种前端框架(如 React, Vue)可以实现极其丰富和复杂的交互式应用,无需任何插件。
  2. Java Web Start (JWS):这是 Sun(现在是 Oracle)推出的 Applet 的替代品,它允许用户从网页下载并启动一个完整的 Java 桌面应用程序,JWS 应用程序拥有与普通桌面应用相同的权限,但需要用户手动确认下载和安装,JWS 也已随 Java 11 被移除。
  3. 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 早期发展的辉煌,但对于任何新的项目,请务必选择现代、主流且被广泛支持的技术。

分享:
扫描分享到社交APP
上一篇
下一篇