Java 教程
- Java - 首页
- Java - 概述
- Java - 历史
- Java - 特性
- Java vs. C++
- JVM - Java虚拟机
- Java - JDK vs JRE vs JVM
- Java - Hello World 程序
- Java - 环境搭建
- Java - 基本语法
- Java - 变量类型
- Java - 数据类型
- Java - 类型转换
- Java - Unicode 系统
- Java - 基本运算符
- Java - 注释
- Java - 用户输入
- Java - 日期与时间
Java 控制语句
- Java - 循环控制
- Java - 决策制定
- Java - if-else
- Java - switch
- Java - for 循环
- Java - for-each 循环
- Java - while 循环
- Java - do-while 循环
- Java - break
- Java - continue
面向对象编程
- Java - OOPs 概念
- Java - 对象与类
- Java - 类属性
- Java - 类方法
- Java - 方法
- Java - 变量作用域
- Java - 构造函数
- Java - 访问修饰符
- Java - 继承
- Java - 聚合
- Java - 多态
- Java - 方法重写
- Java - 方法重载
- Java - 动态绑定
- Java - 静态绑定
- Java - 实例初始化块
- Java - 抽象
- Java - 封装
- Java - 接口
- Java - 包
- Java - 内部类
- Java - 静态类
- Java - 匿名类
- Java - 单例类
- Java - 包装类
- Java - 枚举
- Java - 枚举构造函数
- Java - 枚举字符串
Java 内置类
Java 文件处理
Java 错误与异常
- Java - 异常
- Java - try-catch 块
- Java - try-with-resources
- Java - 多重catch块
- Java - 嵌套try块
- Java - finally 块
- Java - throw 异常
- Java - 异常传播
- Java - 内置异常
- Java - 自定义异常
Java 多线程
- Java - 多线程
- Java - 线程生命周期
- Java - 创建线程
- Java - 启动线程
- Java - 线程连接
- Java - 线程命名
- Java - 线程调度器
- Java - 线程池
- Java - 主线程
- Java - 线程优先级
- Java - 守护线程
- Java - 线程组
- Java - 关闭钩子
Java 同步
Java 网络编程
- Java - 网络编程
- Java - Socket 编程
- Java - URL 处理
- Java - URL 类
- Java - URLConnection 类
- Java - HttpURLConnection 类
- Java - Socket 类
- Java - 泛型
Java 集合
Java 接口
Java 数据结构
Java 集合算法
高级 Java
- Java - 命令行参数
- Java - Lambda 表达式
- Java - 发送邮件
- Java - Applet 基础
- Java - Javadoc 注释
- Java - 自动装箱和拆箱
- Java - 文件不匹配方法
- Java - REPL (JShell)
- Java - 多版本Jar文件
- Java - 私有接口方法
- Java - 内部类菱形运算符
- Java - 多分辨率图像API
- Java - 集合工厂方法
- Java - 模块系统
- Java - Nashorn JavaScript
- Java - Optional 类
- Java - 方法引用
- Java - 函数式接口
- Java - 默认方法
- Java - Base64 编码解码
- Java - switch 表达式
- Java - Teeing Collectors
- Java - 微基准测试
- Java - 文本块
- Java - 动态 CDS 归档
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指针异常
- Java - 打包工具
- Java - 密封类
- Java - 记录类
- Java - 隐藏类
- Java - 模式匹配
- Java - 简洁的数字格式化
- Java - 垃圾回收
- Java - JIT 编译器
Java 杂项
- Java - 递归
- Java - 正则表达式
- Java - 序列化
- Java - 字符串
- Java - Process API改进
- Java - Stream API改进
- Java - 增强的@Deprecated注解
- Java - CompletableFuture API改进
- Java - 流
- Java - 日期时间API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java APIs & 框架
Java 类引用
- Java - Scanner
- Java - 数组
- Java - 字符串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java 有用资源
Java - Applet 基础
一个Applet是一个在Web浏览器中运行的Java程序。Applet可以是一个功能齐全的Java应用程序,因为它可以使用整个Java API。
Applet和独立Java应用程序之间存在一些重要区别,包括以下几点:
Applet是一个扩展了java.applet.Applet类的Java类。
Applet不会调用main()方法,Applet类也不会定义main()。
Applet设计为嵌入HTML页面。
当用户查看包含Applet的HTML页面时,Applet的代码将下载到用户的计算机上。
需要JVM来查看Applet。JVM可以是Web浏览器的插件或单独的运行时环境。
用户计算机上的JVM创建Applet类的实例,并在Applet的生命周期中调用各种方法。
Applet具有Web浏览器强制执行的严格安全规则。Applet的安全通常被称为沙箱安全,将Applet比作在沙箱中玩耍的孩子,必须遵守各种规则。
Applet需要的其他类可以打包在一个Java归档(JAR)文件中下载。
Java中Applet的生命周期
Applet类中的四个方法为您构建任何严肃的Applet提供了框架:
init - 此方法用于Applet所需的任何初始化。在处理Applet标记内的param标记后调用此方法。
start - 在浏览器调用init方法后自动调用此方法。当用户在访问其他页面后返回包含Applet的页面时,也会调用此方法。
stop - 当用户离开包含Applet的页面时,会自动调用此方法。因此,它可以在同一个Applet中重复调用。
destroy - 此方法仅在浏览器正常关闭时调用。因为Applet旨在存在于HTML页面上,所以当用户离开包含Applet的页面后,通常不应留下任何资源。
paint - 在start()方法之后立即调用,并且在Applet需要在浏览器中重新绘制自身时也会调用。paint()方法实际上是从java.awt继承的。
Java Applet生命周期的流程
Applet生命周期方法会自动调用。下图显示了Applet生命周期的流程。
一个简单的Java Applet“Hello, World”
下面是一个名为HelloWorldApplet.java的简单Applet:
import java.applet.*; import java.awt.*; public class HelloWorldApplet extends Applet { public void paint (Graphics g) { g.drawString ("Hello World", 25, 50); } }
这些导入语句将类引入我们的applet类的作用域。
- java.applet.Applet
- java.awt.Graphics
如果没有这些导入语句,Java编译器将无法识别applet类引用的Applet和Graphics类。
Applet类
每个applet都是java.applet.Applet类的扩展。基础Applet类提供了一些方法,派生的Applet类可以使用这些方法从浏览器环境中获取信息和服务。
这些方法包括:
- 获取applet参数
- 获取包含applet的HTML文件的网络位置
- 获取applet类目录的网络位置
- 在浏览器中打印状态消息
- 获取图像
- 获取音频剪辑
- 播放音频剪辑
- 调整applet大小
此外,Applet类还提供了一个接口,查看器或浏览器可以通过该接口获取有关applet的信息并控制applet的执行。查看器可以:
- 请求有关applet的作者、版本和版权的信息
- 请求applet识别的参数的描述
- 初始化applet
- 销毁applet
- 启动applet的执行
- 停止applet的执行
Applet类为每个方法提供了默认实现。可以根据需要覆盖这些实现。
“Hello, World” applet 现在已经完整。唯一被重写的方法是paint方法。
调用Applet
可以通过在HTML文件中嵌入指令并在applet查看器或支持Java的浏览器中查看该文件来调用applet。
<applet>标签是将applet嵌入HTML文件的基石。以下是一个调用“Hello, World” applet的示例:
<html> <title>The Hello, World Applet</title> <hr> <applet code = "HelloWorldApplet.class" width = "320" height = "120"> If your browser was Java-enabled, a "Hello, World" message would appear here. </applet> <hr> </html>
注意 - 可以参考HTML Applet 标签了解更多关于从HTML调用applet的信息。
<applet>标签的code属性是必需的。它指定要运行的Applet类。width和height属性也是必需的,用于指定applet运行的面板的初始大小。applet指令必须用</applet>标签关闭。
如果applet需要参数,可以通过在<applet>和</applet>之间添加<param>标签来传递参数的值。浏览器会忽略applet标签之间的文本和其他标签。
不支持Java的浏览器不会处理<applet>和</applet>。因此,在这些标签之间出现的与applet无关的任何内容都可以在不支持Java的浏览器中看到。
查看器或浏览器会在文档所在位置查找已编译的Java代码。要指定其他位置,请使用<applet>标签的codebase属性,如下所示:
<applet codebase = "https://amrood.com/applets" code = "HelloWorldApplet.class" width = "320" height = "120">
如果applet位于默认包之外的包中,则必须在code属性中使用句点字符(.)来分隔包/类组件,指定其所属的包。例如:
<applet = "mypackage.subpackage.TestApplet.class" width = "320" height = "120">
获取Applet参数
以下示例演示如何使applet响应文档中指定的设置参数。此applet显示黑白和第二种颜色的棋盘图案。
第二种颜色和每个方格的大小可以作为文档中applet的参数来指定。
CheckerApplet在其init()方法中获取其参数。它也可以在paint()方法中获取其参数。但是,在applet启动时一次获取值并保存设置,而不是在每次刷新时都获取,这样更方便、更高效。
applet查看器或浏览器会调用其运行的每个applet的init()方法。查看器会在加载applet后立即调用init()一次。(Applet.init()实现为空操作。)覆盖默认实现以插入自定义初始化代码。
Applet.getParameter()方法根据参数的名称获取参数(参数的值始终是字符串)。如果值是数字或其他非字符数据,则必须解析该字符串。
以下是CheckerApplet.java的框架:
import java.applet.*; import java.awt.*; public class CheckerApplet extends Applet { int squareSize = 50; // initialized to default size 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) { // Let default value remain } }
applet调用parseSquareSize()来解析squareSize参数。parseSquareSize()调用库方法Integer.parseInt(),该方法解析字符串并返回整数。每当其参数无效时,Integer.parseInt()都会抛出异常。
因此,parseSquareSize()捕获异常,而不是允许applet因错误输入而失败。
applet调用parseColor()将颜色参数解析为Color值。parseColor()执行一系列字符串比较,以将参数值与预定义颜色的名称匹配。您需要实现这些方法才能使此applet工作。
指定Applet参数
以下是一个HTML文件的示例,其中嵌入了CheckerApplet。HTML文件通过<param>标签指定applet的两个参数。
示例
<html> <title>Checkerboard Applet</title> <hr> <applet code = "CheckerApplet.class" width = "480" height = "320"> <param name = "color" value = "blue"> <param name = "squaresize" value = "30"> </applet> <hr> </html>
注意 - 参数名称不区分大小写。
应用程序转换为Applet
可以轻松地将图形化Java应用程序(即使用AWT的应用程序,可以使用Java程序启动器启动)转换为可以嵌入网页的applet。
以下是将应用程序转换为applet的具体步骤。
创建一个HTML页面,其中包含加载applet代码的相应标签。
提供一个JApplet类的子类。使这个类是公共的。否则,无法加载applet。
消除应用程序中的main方法。不要为应用程序构建框架窗口。您的应用程序将在浏览器中显示。
将任何初始化代码从框架窗口构造函数移动到applet的init方法。您不需要显式构造applet对象。浏览器会为您实例化它并调用init方法。
删除对setSize的调用;对于applet,大小调整是使用HTML文件中的width和height参数完成的。
删除对setDefaultCloseOperation的调用。applet无法关闭;它在浏览器退出时终止。
如果应用程序调用setTitle,则消除对该方法的调用。applet不能有标题栏。(当然,可以使用HTML标题标签为网页本身添加标题。)
不要调用setVisible(true)。applet会自动显示。
事件处理
Applet从Container类继承了一组事件处理方法。Container类定义了一些方法,例如processKeyEvent和processMouseEvent,用于处理特定类型的事件,然后是一个名为processEvent的总括方法。
为了对事件做出反应,applet必须重写相应的特定于事件的方法。
示例
import java.awt.event.MouseListener; import java.awt.event.MouseEvent; import java.applet.Applet; import java.awt.Graphics; public class ExampleEventHandling extends Applet implements MouseListener { StringBuffer strBuffer; public void init() { addMouseListener(this); strBuffer = new StringBuffer(); addItem("initializing the apple "); } public void start() { addItem("starting the applet "); } public void stop() { addItem("stopping the applet "); } public void destroy() { addItem("unloading the applet"); } void addItem(String word) { System.out.println(word); strBuffer.append(word); repaint(); } public void paint(Graphics g) { // Draw a Rectangle around the applet's display area. g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); // display the string inside the rectangle. g.drawString(strBuffer.toString(), 10, 20); } public void mouseEntered(MouseEvent event) { } public void mouseExited(MouseEvent event) { } public void mousePressed(MouseEvent event) { } public void mouseReleased(MouseEvent event) { } public void mouseClicked(MouseEvent event) { addItem("mouse clicked! "); } }
现在,让我们如下调用此applet:
<html> <title>Event Handling</title> <hr> <applet code = "ExampleEventHandling.class" width = "300" height = "300"> </applet> <hr> </html>
最初,applet将显示“正在初始化applet。正在启动applet”。然后,一旦您单击矩形内部,“鼠标单击”也将显示。
显示图像
applet可以显示GIF、JPEG、BMP和其他格式的图像。要在applet中显示图像,可以使用java.awt.Graphics类中的drawImage()方法。
以下是一个示例,说明显示图像的所有步骤:
示例
import java.applet.*; import java.awt.*; import java.net.*; public class ImageDemo extends Applet { private Image image; private AppletContext context; public void init() { context = this.getAppletContext(); String imageURL = this.getParameter("image"); if(imageURL == null) { imageURL = "java.jpg"; } try { URL url = new URL(this.getDocumentBase(), imageURL); image = context.getImage(url); } catch (MalformedURLException e) { e.printStackTrace(); // Display in browser status bar context.showStatus("Could not load image!"); } } public void paint(Graphics g) { context.showStatus("Displaying image"); g.drawImage(image, 0, 0, 200, 84, null); g.drawString("www.javalicense.com", 35, 100); } }
现在,让我们如下调用此applet:
<html> <title>The ImageDemo applet</title> <hr> <applet code = "ImageDemo.class" width = "300" height = "200"> <param name = "image" value = "java.jpg"> </applet> <hr> </html>
播放音频
applet可以播放由java.applet包中的AudioClip接口表示的音频文件。AudioClip接口具有三种方法,包括:
public void play() - 从头开始播放音频剪辑一次。
public void loop() - 使音频剪辑不断重播。
public void stop() - 停止播放音频剪辑。
要获取AudioClip对象,必须调用Applet类的getAudioClip()方法。getAudioClip()方法会立即返回,无论URL是否解析为实际的音频文件。只有在尝试播放音频剪辑时才会下载音频文件。
以下是一个示例,说明播放音频的所有步骤:
示例
import java.applet.*; import java.awt.*; import java.net.*; public class AudioDemo extends Applet { private AudioClip clip; private AppletContext context; public void init() { context = this.getAppletContext(); String audioURL = this.getParameter("audio"); if(audioURL == null) { audioURL = "default.au"; } try { URL url = new URL(this.getDocumentBase(), audioURL); clip = context.getAudioClip(url); } catch (MalformedURLException e) { e.printStackTrace(); context.showStatus("Could not load audio file!"); } } public void start() { if(clip != null) { clip.loop(); } } public void stop() { if(clip != null) { clip.stop(); } } }
现在,让我们如下调用此applet:
<html> <title>The ImageDemo applet</title> <hr> <applet code = "ImageDemo.class" width = "0" height = "0"> <param name = "audio" value = "test.wav"> </applet> <hr> </html>
您可以使用您电脑上的test.wav来测试上述示例。