java applet 基础

applet 是一种 java 程序。它一般运行在支持 java 的 web 浏览器内。因为它有完整的 java api支持,所以applet 是一个全功能的 java 应用程序。

如下所示是独立的 java 应用程序和 applet 程序之间重要的不同:

  • java 中 applet 类继承了 java.applet.applet 类。
  • applet 类没有定义 main(),所以一个 applet 程序不会调用 main() 方法。
  • applet 被设计为嵌取 dù】朐谝桓 html 页面。
  • 当用户浏览包含 applet 的 html 页面,applet 的代码就被下载到用户的机器上。
  • 要查看一个 applet 需要 jvm。 jvm 可以【 kě yǐ】是 web 浏览器的一个插件,或一个独立的运行时环境。
  • 用户机器上的 jvm 创建一个 applet 类的实例,并调用 applet 生命周期过程中的各种方法。
  • applet 有 web 浏览器强制执行的严格的安全【safest】规则,applet 的安全【safest】机制薄総icket】怀莆诚浒踩
  • applet 需要的其他【qí tā】类可以【 kě yǐ】用 java 归档(jar)文件的形式下载下来。

applet的生命周期

applet 类中的四个方法给我们提供了一个框架,你可以在该框架上开发小程序:

  • init: 该方法的目的是为你的 applet 提供所需的任何初始化。在 applet 标记内的 param 标签被处理后调用该方法。
  • start: 浏览器调用 init 方法后,该方法被自动调用。每当用户从其他【qí tā】页面返回到包含 applet 的页面时,则调用该方法。
  • stop: 当用户从包含 applet 的页面移除的时候【shí hou】,该方法自动被调用。因此【therefore】,可以在相同的 applet 中反复调用该方法。
  • destroy: 此方法仅当浏览器正常关闭时调用。因为 applet 只有在 html 网页上有效,所以你不应该在用户离开【lí kāi】包含 applet 的页面后遗漏任何资源。
  • paint: 该方法在 start() 方法之后立即被调用,或者在 applet 需要重绘在浏览器的时候【shí hou】调用。paint() 方法实际上继承于 java.awt。

"hello, world" applet:

下面是一个简单的 applet 程序 helloworldapplet.java:

helloworldapplet.java 文件代码:

import java.applet.*;import java.awt.*;public class helloworldapplet extends applet{public void paint (graphics g){g.drawstring ("hello world", 25, 50);}}

这些 import 语句将以下类导入到我们的 applet 类中:

java.applet.applet.java.awt.graphics.

没有这些 import 语句,java 编译器就识别不了 applet 和 graphics 类。


applet 类

每一个 applet 都是 java.applet.applet 类的子类,基础的 applet 类提供了供衍生类调用的方法,以此来得到浏览器上下文的信息和服务【services】。

这些方法做了如下事情【affair】:

  • 得到 applet 的参数
  • 得到包含 applet 的 html 文件的网络位置【locates】
  • 得到 applet 类目录的网络位置【locates】
  • 打印浏览器的状态信息
  • 获取一张图片
  • 获取一个音频片段
  • 播放一个音频片段
  • 调整此 applet 的大小

除此之外,applet 类还提供了一个接口,该接口供 viewer 或浏览器来获取 applet 的信息,并且来控制 applet 的执行。

viewer 可能【kě néng】是:

  • 请求 applet 作者、版本和版权的信息
  • 请求 applet 识别的参数的描述
  • 初始化 applet
  • 销毁 applet
  • 开始【appeared】执行 applet
  • 结束【jié shù】执行 applet

applet 类提供了对这些方法的默认实现,这些方法可以在需要的时候重写。

"hello,world"applet 都是按标准编写的。唯一【sole】被重写的方法是 paint 方法。


applet 的调用

applet 是一种 java 程序。它一般运行在支持 java 的 web 浏览器内。因为它有完整的 java api 支持,所以 applet 是一个全功能的 java 应用程序。

<applet> 标签是在html文件中嵌取 dù】 applet 的基础。以下是一个调用"hello world"applet的例子;

html 代码:

<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> 标签的属性指定了要运行的 applet 类。width 和 height 用来指定 applet 运行面板的初始大小。applet 必须使用 </applet> 标签来关闭。

如果 applet 接受参数,那么参数的值需要在 <param> 标签里添加,该标签位于 <applet> 和 </applet> 之间。浏览器忽略了 applet 标签之间的文本和其他标签。

不支持 java 的浏览器不能执行 <applet> 和 </applet>。因此【therefore】,在标签之间显示并且和 applet 没有关系的任何东西,在不支持的 java 的浏览器里是可见的。

viewer 或者浏览器在文档的位置寻找编译过的 java 代码,要指定文档的路径,得使用 <applet> 标签的 codebase 属性指定。

如下所示:

<applet codebase="http://amrood.com/applets"
code="helloworldapplet.class" width="320" height="120">

如果 applet 所在一个包中而不是默认包,那么所在的包必须在 code 属性里指定,例如:

<applet code="mypackage.subpackage.testapplet.class"
  width="320" height="120">

获得applet参数

下面的例子演示了如何【how】使用一个 applet 响应来设置文件中指定的参数。该 applet 显示了一个黑色棋盘图案和第二种颜色。

第二种颜色和每一列的大小通过文档中的 applet 的参数指定。

checkerapplet 在 init() 方法里得到它的参数。也可以在 paint() 方法里得到它的参数。然而,在 applet 开始【appeared】得到值并保存了设置,而不是每一次刷新的时候都得到值,这样是很方便,并且高效的。

applet viewer 或者浏览器在 applet 每次运行的时候调用 init() 方法。在加载 applet 之后,viewer 立即调用 init() 方法(applet.init()什么也没做),重写该方法的默认实现,添加一些自定义的初始化代码。

applet.getparameter() 方法通过给出参数名称得到参数值。如果得到的值是数字或者其他非字符数据,那么必须解析为字符串类型。

下例是 checkerapplet.java 的修改:

checkerapplet.java 文件代码:

import java.applet.*;import java.awt.*;public class checkerapplet extends applet{int squaresize=50;// 初始化默认大小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.parseintjs随机数 (param);}catch (exception e) {// 保留默认值}}

该 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>

注意: 参数名字大小写不敏感【gǎn】。


应用程序转换成 applet

将图形化的 java 应用程序(是指,使用awt的应用程序和使用 java 程序启动器启动的程序)转换成嵌入在web页面里的applet是很简单的。

下面是将应用程序转换成 applet 的几个步骤:

  • 编写一个 html 页面,该页面带有能加载 applet 代码的标签。
  • 编写一个 japplet 类的子类,将该类设置为 public。否则,applet 不能被加载。
  • 消除应用程序的 main()方法。不要为应用程序构造框架窗口,因为你的应用程序要显示在浏览器中。
  • 将应用程序中框架窗口的构造方法里的初始化代码移到 applet 的 init() 方法中,你不必显示的构造 applet 对象,浏览器将通过调用 init() 方法来实例化一个对象。
  • 移除对 setsize() 方法的调用,对于 applet 来讲,大小已经通过 html 文件里的 width 和 height 参数设定好了。
  • 移除对 setdefaultcloseoperation() 方法的调用。applet 不能被关闭,它随着【suí zhe】浏览器的退出而终止。
  • 如果应用程序调用了 settitle() 方法,消除对该方法的调用。applet 不能有标题栏。(当然你可以给通过 html 的 title 标签给网页自身命名)
  • 不要调用 setvisible(true),applet 是自动显示的。

事件处理

applet 类从 container 类继承了许多【many】事件处理方法。container 类定义了几个方法,例如:processkeyevent() 和processmouseevent(),用来处理特别类型的事件,还有一个捕获所有【suǒ yǒu】事件的方法叫做 processevent。

为了响应一个事件,applet 必须重写合适的事件处理方法。

exampleeventhandling.java 文件代码:

import java.awt.event.mouselistener;import java.awt.event.mouseevent;import java.applet.applet;import java.awt.graphics;public class exampleeventhandling extends appletimplements mouselistener {stringbuffer strbuffer;public void init() {addmouselistener(this);strbuffer=new stringbuffer();additem("initializing the applet ");}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! ");
所以即便房屋倒塌了,也不会造成太严重的后果。
“那时我们住在亚罗士打二条路,外婆到了70多岁时,还常往戏院里钻。
曾金太孺人是于3月19日晚上永别人间,并于23日中午举殡。
”因此,他也建议,政府应让本地作品获得免税,以协助他们在演艺界的发展。
当天的赏樱会,深入重灾区仙台等地参加抗震救灾活动的湖南人会会员和日本朋友将报告切身体会,还将举行为大地震的捐款活动,表达旅日华人和日本友人对受灾民众支援的心情。
清华大学等中国【zhōng guó】多所大学出现了给日本灾民捐款的活动,3月17日,《读卖新闻》对此进行了报道。
}}

如下调用该 applet:

<html><title>event handling</title><hr><applet code="exampleeventhandling.class"width="300" height="300"></applet><hr></html>

最开始运行,applet 显示 "initializing the applet. starting the applet.",然后你一点击矩形框,就会显示 "mouse clicked" 。


显示图片

applet 能显示 gif,jpeg,bmp 等其他格式的图片。为了在 applet 中显示图片,你需要使用 java.awt.graphics 类的drawimage()方法。

如下实例演示了显示图片的所有【suǒ yǒu】步骤:

imagedemo.java 文件代码:

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 barcontext.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() 方法。无论 url 指向的是否是一个真实的音频文件,该方法都会立即返回结果。

直到要播放音频文件时,该文件才会下载下来。

如下实例演示了播放音频的所有步骤:

audiodemo.java 文件代码:

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 urljs随机数=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>

你可以使用你电脑【computer】上的 test.wav 来测试上面的实例。