Java - 小程序基础
小程序 是在 Web 浏览器中运行的 Java 程序。小程序可以是功能齐全的 Java 应用程序,因为它拥有整个 Java API 供其使用。
小程序和独立 Java 应用程序之间有一些重要的区别,包括以下内容 -
-
小程序是扩展 java.applet.Applet 类的 Java 类。
-
小程序上不调用main()方法,小程序类不会定义main()。
-
Applet 旨在嵌入 HTML 页面中。
-
当用户查看包含小程序的 HTML 页面时,小程序的代码会下载到用户的机器上。
-
查看小程序需要 JVM。 JVM既可以是Web浏览器的插件,也可以是单独的运行环境。
-
用户机器上的JVM创建一个applet类的实例,并在applet的生命周期内调用各种方法。
-
Applet 具有由 Web 浏览器强制执行的严格安全规则。小程序的安全性通常被称为沙盒安全性,将小程序比作在沙盒中玩耍的孩子,必须遵守各种规则。
-
小程序需要的其他类可以下载到单个 Java 存档 (JAR) 文件中。
小程序的生命周期
Applet 类中的四种方法为您提供了构建任何重要小程序的框架 -
-
初始化 − 此方法适用于您的小程序所需的任何初始化。处理完applet标签内的param标签后调用。
-
开始 − 该方法在浏览器调用init 方法后自动调用。每当用户在离开其他页面后返回到包含小程序的页面时也会调用它。
-
停止 − 当用户离开小程序所在的页面时,会自动调用此方法。因此,它可以在同一个小程序中重复调用。
-
摧毁 − 该方法仅在浏览器正常关闭时调用。因为 applet 是在 HTML 页面上运行的,所以通常不应在用户离开包含 applet 的页面后留下资源。
-
绘画 - 在 start() 方法之后立即调用,也可以在小程序需要在浏览器中重新绘制自身的任何时候调用。 paint() 方法其实是继承自 java.awt 的。
“Hello, World”小程序
以下是一个名为 HelloWorldApplet.java 的简单小程序 -
import java.applet.*; import java.awt.*; public class HelloWorldApplet extends Applet { public void paint (Graphics g) { g.drawString ("Hello World", 25, 50); } }
这些导入语句将这些类带入了我们的小程序类的范围 -
- java.applet.Applet
- java.awt.Graphics
如果没有这些 import 语句,Java 编译器将无法识别 Applet 类所引用的 Applet 和 Graphics 类。
小程序类
每个小程序都是 java.applet.Applet 类的扩展 .基 Applet 类提供了派生 Applet 类可以调用的方法,以从浏览器上下文中获取信息和服务。
这些包括执行以下操作的方法 -
- 获取小程序参数
- 获取包含小程序的 HTML 文件的网络位置
- 获取小程序类目录的网络位置
- 在浏览器中打印状态消息
- 获取图片
- 获取音频片段
- 播放音频片段
- 调整小程序的大小
此外,Applet 类提供了一个接口,查看器或浏览器通过该接口获取有关 applet 的信息并控制 applet 的执行。观看者可能 -
- 请求有关小程序的作者、版本和版权的信息
- 请求描述小程序识别的参数
- 初始化小程序
- 销毁小程序
- 开始执行小程序
- 停止小程序的执行
Applet 类提供了这些方法的默认实现。这些实现可以根据需要被覆盖。
“Hello, World”小程序就这样完成了。唯一被覆盖的方法是paint方法。
调用小程序
可以通过在 HTML 文件中嵌入指令并通过小程序查看器或支持 Java 的浏览器查看文件来调用小程序。
<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 Tag 了解更多关于从 HTML 调用 applet 的内容。
标记关闭。
如果applet 接受参数,则可以通过在 之间添加 标记来为参数传递值。浏览器会忽略小程序标签之间的文本和其他标签。
不支持 Java 的浏览器不处理 。因此,标签之间出现的任何与小程序无关的内容,在不支持 Java 的浏览器中都是可见的。
查看器或浏览器在文档位置查找已编译的 Java 代码。要另外指定,请使用
<applet codebase = "https://amrood.com/applets" code = "HelloWorldApplet.class" width = "320" height = "120">
如果小程序驻留在默认值以外的包中,则必须在代码属性中使用句点字符 (.) 来指定保存包以分隔包/类组件。例如 -
<applet = "mypackage.subpackage.TestApplet.class" width = "320" height = "120">
获取小程序参数
以下示例演示如何使小程序响应文档中指定的设置参数。此小程序显示黑色和第二种颜色的棋盘格图案。
第二种颜色和每个方块的大小可以作为参数指定给文档中的小程序。
CheckerApplet 在 init() 方法中获取其参数。它也可以在paint() 方法中获取它的参数。但是,在小程序启动时获取值并保存设置一次,而不是每次刷新,这样既方便又高效。
小程序查看器或浏览器调用它运行的每个小程序的 init() 方法。查看器在加载小程序后立即调用一次 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 } }
小程序调用 parseSquareSize() 来解析 squareSize 参数。 parseSquareSize() 调用库方法 Integer.parseInt(),它解析一个字符串并返回一个整数。每当其参数无效时,Integer.parseInt() 都会抛出异常。
因此,parseSquareSize() 会捕获异常,而不是让小程序因输入错误而失败。
小程序调用 parseColor() 将颜色参数解析为颜色值。 parseColor() 进行一系列字符串比较,以将参数值与预定义颜色的名称相匹配。您需要实现这些方法才能使这个小程序工作。
指定小程序参数
下面是一个嵌入了 CheckerApplet 的 HTML 文件示例。 HTML 文件通过 标记为小程序指定两个参数。
<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>
注意 − 参数名称不区分大小写。
应用程序转换为小程序
将图形 Java 应用程序(即使用 AWT 并且可以从 Java 程序启动器启动的应用程序)转换为可以嵌入网页中的小程序很容易。
以下是将应用程序转换为小程序的具体步骤。
-
制作一个带有适当标签的 HTML 页面来加载小程序代码。
-
提供 JApplet 类的子类。将此课程公开。否则无法加载小程序。
-
消除应用程序中的主要方法。不要为应用程序构建框架窗口。您的应用程序将显示在浏览器中。
-
将任何初始化代码从框架窗口构造函数移动到小程序的 init 方法。您不需要显式构造小程序对象。浏览器为你实例化它并调用init方法。
-
移除对 setSize 的调用;对于小程序,大小是通过 HTML 文件中的宽度和高度参数来完成的。
-
删除对 setDefaultCloseOperation 的调用。小程序无法关闭;它在浏览器退出时终止。
-
如果应用程序调用 setTitle,则消除对该方法的调用。小程序不能有标题栏。 (当然,您可以使用 HTML 标题标签为网页本身命名。)
-
不要调用 setVisible(true)。小程序会自动显示。
事件处理
Applet 从 Container 类继承了一组事件处理方法。 Container 类定义了几个方法,例如 processKeyEvent 和 processMouseEvent,用于处理特定类型的事件,然后定义了一个包罗万象的方法,称为 processEvent。
为了对事件做出反应,小程序必须覆盖适当的事件特定方法。
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! "); } }
现在,让我们按如下方式调用这个小程序 -
<html> <title>Event Handling</title> <hr> <applet code = "ExampleEventHandling.class" width = "300" height = "300"> </applet> <hr> </html>
最初,小程序将显示“正在初始化小程序。启动小程序”。然后在矩形内单击后,也会显示“鼠标单击”。
显示图片
小程序可以显示 GIF、JPEG、BMP 等格式的图像。要在小程序中显示图像,请使用 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); } }
现在,让我们按如下方式调用这个小程序 -
<html> <title>The ImageDemo applet</title> <hr> <applet code = "ImageDemo.class" width = "300" height = "200"> <param name = "image" value = "java.jpg"> </applet> <hr> </html>
播放音频
小程序可以播放由 java.applet 包中的 AudioClip 接口表示的音频文件。 AudioClip 接口有三个方法,包括 -
-
公共无效播放() − 从头开始播放一次音频片段。
-
公共无效循环() − 使音频片段不断重播。
-
公共无效停止() − 停止播放音频片段。
要获取 AudioClip 对象,您必须调用 Applet 类的 getAudioClip() 方法。无论 URL 是否解析为实际的音频文件,getAudioClip() 方法都会立即返回。在尝试播放音频剪辑之前,不会下载音频文件。
以下是一个示例,说明了播放音频的所有步骤 -
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(); } } }
现在,让我们按如下方式调用这个小程序 -
<html> <title>The ImageDemo applet</title> <hr> <applet code = "ImageDemo.class" width = "0" height = "0"> <param name = "audio" value = "test.wav"> </applet> <hr> </html>
您可以在您的 PC 上使用 test.wav 来测试上面的例子。
java