Applet程序设计
5.1 Applet概述
Applet是可以再Web浏览器上运行的小型Java程序,它可以运行在支持Java的浏览器中,例如IE和Netscape等,使用Applet可以大幅度提高网页的交互能力。
当用户访问网页中包含Applet程序时,Applet将被下载到本机执行,一个包含Applet程序的HTML网页可以实现添加声音、动画、游戏等特性到网页中,从而吸引网站浏览者,增加网站流量。
Applet类的层次关系
Applet类继承了Panel类,是一个容器,在Applet程序开发中多使用JApplet类,它是Java Swing中的成员,继承了Applet类,JApplet类的继承关系如下图所示。
JApplet和Java Swing中的JFrame窗体类似,可以容纳各种组件,例如按钮、标签、列表框、文本框等。
简单Applet实例
(1) 创建HelloApplet类,该类必须继承JApplet类,并且覆盖父类的init()方法。
代码:
import java.awt.Container;
import javax.swing.JApplet;
import javax.swing.JLabel;
public class HelloApplet extends JApplet{
public void init() {
Container c=getContentPane();
JLabel l=new JLabel("HelloWorld");
add(l); }
}
(2)编写“HelloApplet.html”文件,在该文件中使用<Applet>标签装载Applet程序。
代码:
<html>
<body>
<Applet code=“HelloApplet.class” width=200 height=100>
</Applet>
</body>
</html>
使用appletviewer.exe执行Applet
例如:
……>appletviewerHelloApplet.html
注意:
(1)字节码文件(class文件),网页文件要放在同一个文件夹中。
(2)运行的当前目录为网页所在的目录。
Applet生命周期
Applet程序没有main()方法,它是在init()方法中创建并使用组件的。Applet声明周期包括4个阶段。
(1)init()方法
Applet程序的初始化阶段会调用该方法,实现程序初始化。
(2)start()方法
Applet程序的开始阶段,当完成Applet的初始化以后,将会执行该方法。
(3)stop()方法
Applet程序的暂停阶段,当用户离开包含Applet的页面时,将调用该方法。
(4)destroy()方法
Applet程序的销毁阶段,该方法仅在用户正常关闭浏览器时被调用,它用于Applet被结束之前,释放程序所占用的资源和执行程序结束时的任务。
这4个生命周期的方法不应该直接调用,它们由Applet程序自动执行,程序设计人员需要做的就是根据需要覆盖其中的某个方法.
绘图方法
public void paint(Graphics g)
绘制容器。
参数为Graphics类的实例,用于在Applet中绘图或者写入文本。
public abstract void drawString(String str,intx,int y)
str:要绘制的String.
x:x坐标
y: y坐标
重绘repaint()方法
重绘组件。当用户调用repaint()方法时,发生:程序首先清除repaint()方法以前所画的内容,然后再调用repaint()方法。
更新update(Graphicsg)方法
更新容器。update方法通常清除当前的显示并调用paint()方法。
archive=archiveList
可选属性,描述了一个或多个含有将被“预装”的类和其他资源的archives.
code=appletFile.class
必须属性,插入的类文件。
width=pixels height=pixels
必选属性,给出applet显示区域的初始宽度和高度。
codebase=codebaseURL
可选属性,指定了applet所在的目录。
alt
可选属性,当浏览器能读取applet标记但不能执行java applet时要显示的文本。
name
可选属性,为Applet实例指定有关名称。
align
可选属性,指定了applet的对齐方式。
vspace
可选属性,指定了在applet上下左右的像素数目。
<param name=appletAttributel value=value>
可选属性,提供了一种可带有“外部”指定的数值的Applet,它对一个java应用程序的作用与命令行参数。
Applet用getParameter()方法来存取它们的属性。
实例1Applet程序:
import javax.swing.JApplet;
import java.awt.Graphics;
public class Java_1 extends JApplet{
public void paint(Graphics g)
{ g.drawString("欢迎你参加java考试“,25,25);
}
}
HTML代码如下:
<html>
<applet code="java_1.class"width=300 height=30>
</applet>
</html>
9.2.3 Graphics类
Applet程序中除了使用Swing组件显示界面之外,还可以使用Graphics类提供的各种方法,在Applet程序中绘制多种图形、图片和文字等。
1.绘制文本
2.Graphics类中的方法drawString (String ,int,int)来输出字符串。
3.例如:
4.import javax.swing.*;
5.importjava.awt.*;
6.public classAppletString extends JApplet{
7. public void paint(Graphics g){
8. g.drawString("Helloworld",10,20);
9. }
10.}
2、Graphics类 绘制图片
绘制图片,就是在Applet容器中显示一个事先准备好的图片资源。
(1)drawImage()方法
绘制图片由drawImage()方法实现,它可以指定绘制图片的位置和大小。格式如下:
drawImage(Image img, int x, int y,ImageObserver observer)
img:该参数是要绘制的图片对象,如果该参数为null,那么该方法不做任何操作。
x:绘制图片的x坐标。
y:绘制图片的y坐标。
observer:绘制图片需要通知的对象,一般设置为Applet本身即可。
drawImage ()方法
drawImage(Image img,int x, int y,int width,int height, ImageObserver observer)
width:该参数指定图片显示的宽度。
height:该参数指定图片显示的高度,这两个参数可以实现图片的缩放。
(2) getImage()方法
在Applet程序中获取图片使用getImage()方法.格式如下:
getImage (URL url)
url:图片文件的URL路径,该路径必须是指定图片文件位置的绝对路径。
getImage (URL url, String name)
url:给出图片文件基本位置的绝对URL路径,例如
“F:\\javaex\\/”。
name:图片位置的相对路径,该路径相对于url参数。
(3)getCodeBase()方法
当图片与class文件同在一个目下下时,可采用此方法获取图片路径。
例如:Image i=getImage(getCodeBase(),”01.jpg”);
【9-3】在Applet中显示图片
(1)Java文件
import javax.swing.*;
import java.awt.*;
public class ImgPlayer extends JApplet{
Image img;
public void init(){
img=getImage( getCodeBase() ,"04.jpg");
}
public void paint(Graphics g){
g.drawImage(img,10,10,this);
// g.drawImage(img,10,10,300,200,this); //图片缩放
}
}
(2)html文件
<html>
<body>
<Applet code=“ImgPlayer.class” width=500 height=400 >
</body>
</html>
9.4 音 频 播 放
Java语言除了能够处理图片资源之外,还可以获取并播放音频、视频等多媒体资源。Applet程序可以使用AudioClip接口提供的相关API来实现音频播放、停止和循环播放,支持的主要音频格式有AIFF、AU、MIDI、WAV、RMF等。AudioClip接口中定义了play()、stop()、loop()3个方法,这3个方法分别用于音频播放、停止和循环操作。
(1)play()方法
该方法将从头开始重新播放指定的音频剪辑。语法格式为:
play(URL url)
play(URL url, String name)
参数:
url:该参数指定了音频资源的URL绝对路径。
name:音频文件名称,它相对于url参数的音频剪辑位置
(2)stop()方法
该方法将停止当前正在播放的音频剪辑。
(3)loop()方法
该方法将循环播放指定的音频剪辑。
(4)getAudioClip()方法
该方法可以获取URL参数指定的AudioClip对象,该对象是AudioClip接口的一个实现,当调用该对象的方法进行音频播放时,音频资源中的数据将被加载并播放。
语法格式为:
getAudioClip(URL url)
getAudioClip(URL url, String name)
参数:
url:音频资源的URL参考路径。
name:音频文件名称,它相对于url参数的音频剪辑位置。
(5)newAudioClip()方法
该方法可以创建AudioClip对象,它是一个静态方法,在所有Java程序中都可以使用Applet类的静态方法newAudioClip()创建AudioClip对象,实现音频播放。
一般格式为:
try {
URL url=new URL(getCodeBase()+"08.WAV");
AudioClip audio = newAudioClip(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
(1)java文件
import java.applet.AudioClip;
import javax.swing.JApplet;
public class Audio1 extends JApplet{
AudioClip audio;
public void init(){
audio=getAudioClip(getCodeBase(),“08.WAV");
}
public void start(){ audio.play(); }
public void stop(){ audio.stop(); }
}
Html文件
<html>
<applet code=“Audio1 .class” height=300 width=200>
</applet>
</html>
import java.applet.AudioClip;
import javax.swing.JApplet;
import java.net.*;
public class Audio2 extends JApplet{
AudioClip audio;
public void init(){
try{
URL url=new URL(getCodeBase()+"99121605.mid");
audio=newAudioClip(url);
}
catch(Exception e){}
}
public void start(){ audio.play(); }
public void stop(){ audio.stop(); }
}
(1)width属性
该属性用于指定Applet程序在HTML网页中的宽度,例如width=200。这将限制Applet程序界面的大小。
(2)height属性
该属性用于指定Applet程序在HTML网页中的高度,例如height=100。这将限制Applet程序界面的大小。
(3)code属性
该属性用于指定Applet程序的类文件名称,默认情况下,该属性所指定的类文件的位置相对于当前HTML文件所在位置。例如code="Hello.class",那么“Hello.class”文件必须存放在与HTML文件相同的文件夹中。
(4)align属性
该属性是关于Applet程序定位的属性,它可以指定Applet的对齐方式,例如align="left"和align="right"分别可以使Applet左对齐和右对齐,能够实现Applet被文字环绕的效果,如下图所示。
属 性 值 说 明
left 使Applet程序在网页中左对齐,后面的文本环绕在Applet程序右侧
right 使Applet程序在网页中右对齐,后面的文本环绕在Applet程序左侧
top 在网页中使Applet程序顶部与当前行顶部对齐
middle 在网页中使Applet程序中部与当前行的基线对齐
absmiddle 在网页中使Applet程序中部与当前行的中部对齐,请区别于middle
bottom 在网页中使Applet程序底部与当前行文本的底部对齐
absbottom 在网页中使Applet程序底部与当前行底部对齐,请区别于bottom
texttop 在网页中使Applet程序顶部与当前行文本顶部对齐,请区别于top
baseline 在网页中使Applet程序底部与当前行的基线对齐
HTML的Applet标签和属性
(5)vspace属性与hspace属性
这两个属性分别用于设置Applet程序在上下垂直方向空白的像素数目,和Applet程序在左右水平方向空白的像素数目。例如使Applet程序左对齐,并且上下空白50像素,左右空白100像素,可以使用如下的HTML代码:
<Applet code="Hello.class"width=150 height=100 align="left" vspace="50"hspace="100">
</Applet>
(6)codebase属性
该属性用于指定Applet程序的路径,该路径相对与当前HTML网页文件,例如“Hello.class”类文件位于myApplets文件夹中,可以使用如下代码加载Applet:
<Applet codebase="myApplets"code="Hello.class" width=150 height=100></Applet>
code属性只用于指定Applet程序名称,例如"com.lzw.Hello.class",而codebase属性则用于指定Applet程序的位置,当指定了codebase属性之后,code属性指定的程序名称,不再相对于当前HTML文件,而是相对于codebase属性指定的程序位置,但是codebase属性则相对与当前HTML文件的位置。
(7)archive属性
该属性可以指定包含Applet程序的JAR文件,JAR文件是Java程序的打包文件,它采用ZIP格式将程序压缩,使Java程序的体积大幅度缩小,这样,在浏览包含Applet程序的网页时,Applet程序的下载时间相对缩短,从而提高程序运行速度。
(8)name属性
该属性为Applet程序指定名称,使网页脚本可以通过改名成获取Applet程序实例,并使用该实例操作Applet程序。
JAR文件是Java的打包文件,它可以将多个编译后的类文件和图片、音频、视频、文本、属性等资源封装到一个JAR文件中。
(1)使用JDK生成JAR文件的一般格式为:
jar cvf jarName file1 file2……
cvf:该参数用于生成JAR压缩文档并输出详细信息。
jarName:该参数用于指定JAR文件名称。
file1:添加到JAR文件中的第一个文件。
file2:添加到JAR文件中的第二个文件(可以使用通配符指定多个文件,也可以在file2参数后再指定其他文件)。
方法一:打包所有文件
(1)将要打包的所有文件放在同一个目录下。
(2)在此目录下创建manifest.mf文件,文件内容:
Main-Class: 主类名 回车
DOS命令行,当前目录为*. Class所在的目录:
(3)当前目录下输入下列命令:
jar cvfm jarName mainfest.mf file1file2……
方法二:打包一个package
(1)manifest.mf文件中写明主类,格式:
Main-Class: 包名.主类名 enter
(2)把manifest.mf文件与package放在同一个目录下
(3)DOS命令行,当前目录为包所在的目录:
jar cvfmjarName mainfest.mf 包名
现在的应用程序、操作系统、开发工具逐渐图形化,而且有很多的命令由于参数过多难以记忆,使用开发工具完成JAR文件的创建已经是最常用的一种方式。Eclipse作为一个强大的Java开发工具,不但提供了Java源程序的代码辅助、智能纠错、动态调试等环境,而且还可以直接将程序代码导出成为一个JAR文档文件。
具体操作步骤如下。
将程序制作成JAR文件之后,在HTML的<Applet>标签中访问JAR文件中的Applet程序可以使用如下HTML代码:
<html>
<body>
<Applet code="AudioPlayer.class" width=437 height=200archive="AudioPlay.jar">
</Applet>
</body>
</html>
<Applet>标签使用archive属性指定了“AudioPlay.jar”文件,Applet程序在运行时期,会先下载该JAR文件,然后运行JAR文件中的ImgPlayer.class类文件。
HTML的<Applet>标签可以为Applet程序设置各种初始属性,例如宽度、高度、对齐方式等,但是有些情况下,Applet程序需要根据参数初始化自己,这可以通过<Applet>标签的子标签<Param>来实现。
一般格式为:
<Applet code="……" width=437 height=200>
<param name="参数名" value="参数值">
……
</Applet>
name:该参数用于设置传递给Applet程序的参数名称。
value:该参数用于设置传递给Applet程序的参数值。
在Applet程序中可以使用getParameter()方法获取<param>标签提供的参数。
语法格式为:getParameter(Stringarg)
arg:该参数是<param>标签设置的参数名称。
例如,获取<param>标签设置的商品单价参数“price”,可以使用如下代码:
public void init() {
String priceArg = getParameter("price");
float price=Float.parseFloat(priceArg);
……
}
在Applet程序中可以使用getParameter()方法获取<param>标签提供的参数。
语法格式为:getParameter(Stringarg)
arg:该参数是<param>标签设置的参数名称。
例如,获取<param>标签设置的商品单价参数“price”,可以使用如下代码:
public void init() {
String priceArg = getParameter("price");
float price=Float.parseFloat(priceArg);
……
}
import java.awt.*;
import javax.JApplet.*;
public class ParamApplet extends JApplet{
int sum;
String s1,s2;
public void init(){
s1=getParameter(“girl”);
s2=getParameter(“boy”);
//需要将字符串转化为整形后才可以进行计算
sum=Integer.parseInt(s1)+Integer.parseInt(s2);
}
public void paint(Graphics g)
{ g.drawString(“女”+s1+”名,”+”男”+s2+”,共”+sum+”人。”,50,50); }
}
HTML的<Applet>标签可以使用name属性为Applet程序命名,这样JavaScript脚本就可以获取Applet程序的实例,并调用Applet程序的方法执行相关操作。
【例9-6】
Applet上下文是实现AppletContext接口的对象。通过该对象可以实现获取同一个网页中的所有Applet程序、在浏览器状态栏中显示信息、显示指定URL的网页等。获取Applet上下文需要使用getAppletContext()方法。
一般格式为:
AppletContext appletContext = getAppletContext();
Applet上下文提供了获取其他Applet程序实例的方法,这样就可以控制获取的Applet程序实例,从而实现对其他Applet程序的控制。Applet上下文中获取其他Applet程序的方法有两种。
(1)getApplets()方法
getApplets()方法用于获取包含在同一个上下文中的所有Applet程序,该方法返回一个枚举类型的实例,这个枚举类型中包含了同一个上下文中的其他Applet程序的引用。
语法格式为:
Enumeration applets = appletContext.getApplets();
appletContext:这是一个Applet上下文对象。
(2)get Applets(String name)方法
getApplets()方法用于获取同一个上下文中指定名称的Applet程序,该方法返回一个Applet程序的引用。
语法格式为:
appletContext.getApplet(String name);
appletContext:这是一个Applet上下文对象。
name:该参数是另外一个Applet程序的名称。
【例9-7】
Applet程序存放在远程服务器端,当用于浏览服务器的网页时,将自动下载该Applet程序,然后在本地执行,如果有人使用Applet程序编写恶意程序,对用户主机进行攻击,或盗取用户资料,例如银行账号、密码等信息,将对用户造成极大地损害。所以,安全成为Applet至关重要的问题。
Applet程序可以运行在任何一个平台(即操作系统)中,在不同的平台上可以实现相同的功能,这些功能包括:
(1)显示图片;
(2)播放音频;
(3)获取用户的鼠标、键盘操作事件;
(4)把用户输入的信息提交给服务器。
这些功能对于网站信息提示、图片处理、在线交互、提交订单等业务来讲,已经足够完成网站中的各种任务。所以,对于其他操作必须加以限制,例如访问本地文件、获取用户和系统信息等操作。
Applet拥有安全管理器,它为程序提供了足够的安全保障,当Applet程序违反安全规则时,Applet安全管理器将抛出SecurityException异常,Applet有以下安全限制。
(1)不允许执行任何本地程序。
(2)不允许对本地文件进行读写操作。
(3)在Applet弹出窗口中都会带有一个警告信息。
(4)只能获取少量的计算机信息,例如Java虚拟机的版本、操作系统版本与名称,还有文件分隔符、换行符等特殊字符。
(5)不能获取用户名、E-mail地址等信息。
(6)Applet不能与其他服务器通信,只能与存放Applet程序的服务器进行通信。