内容提示:Applet是在互连网上传播的,能够自动下载到浏览器上,作为Web页面一部分运行的小应用程序。学习和使用Applet,可以使开发人员轻松地将Java编程应用于网络。Applet不仅能够创建出来五彩缤纷的网站页面,还可以极大地丰富页面的功能,为网站开发注入活力。本章将介绍Java Applet的基本工作原理和应用方法。
一个Java应用程序经过编译成.class后,可直接通过Java解释器来执行。一个Java Applet在执行时也是先被编译成为.class文件,但必须再将字节码文件嵌入到Web页面中,通过浏览器或使用JDK中的appletviewer命令来运行。
在第2章中的例2-2是一个简单的Applet例子,编译后将得到的字节码文件嵌入到一个HTML文件中,用支持Java的浏览器打开包含Applet的网页,Applet会自动运行。
其运行过程请参照本书第2章的相关内容。
appletviewer是JDK下的一个Applet查看工具,在Java安装目录下的bin文件夹中可以找到这个可执行文件。
appletviewer犹如一个最小化的Java浏览器,使开发者不必使用Web浏览器即可运行Java Applet程序。执行时appletviewer会读取命令行URL所指定的HTML文件,这个文件必须包含一个或多个装入和执行Applet的指令。appletviewer会忽略所有其他的HTML代码,不会显示普通的HTML或嵌入到一个文本文件中的Applet。
Appletview带有一个命令行参数形式的URL,它指向一个含有Applet引用的HTML文件。这个Applet引用是一个指定了appletviewer要装载代码的HTML标记:
<applet code="HelloApplet.class" width="220" height="160"></applet>
需要注意的是,这个标记的通用格式与任何其他HTML相同,即使用“<”和“>”两个符号来分隔指令。另外还必须使用<applet……>和</applet>,<applet……>部分指明了代码的入口、宽度、高度等内容,通常执行Applet时应指名Applet窗口的大小。
一个Java应用程序必须含有一个main()方法,作为应用程序执行的入口点,并在整个程序运行过程中,使main()方法贯穿始终,在Java Applet中没有main()方法,入口点也不只一个。
由于一个网页在浏览器中显示时可能会发生各种情况,比如打开网页、切换到另一网页、一个网页被一窗口盖住而后又露出等,对于每种情况,Applet都必须作出响应,所以,针对每种情况,Applet都有一个响应的入口点,使之运行。
applet类提供了四个主要的方法:init、start、stop和destroy,它们构成了创建任何Applet的框架,并实现了一个Applet从诞生、执行到停止、消亡的生命周期。
l init()方法:Applet第一次被加载时调用,主要功能是完成初始化操作,包括创建Applet对象、分配内存、设置初始状态等,在Applet生命周期中只运行一次。其格式为:public void init(){……}。
l start()方法:初始化后或Applet停止运行随后又重新启动时调用,主要用于创建、启动及重新启动Applet,在Applet生命周期中,start()方法被调用多次,一般与stop方法配套运行。其格式为:public void start(){……}。
l stop()方法:在用户离开包含Applet的页面时被调用,该方法的主要功能是停止耗时操作,以免降低系统运行速度,该方法会在Applet生命周期中调用多次。
l destroy():Web浏览器中的Java解释器重新载入HTML或关闭包含Applet页面的浏览器时调用,该方法的功能是清除Applet,释放其所占用的系统资源。
Applet的另一个主要方法是paint()方法,这个方法可以使一个Java Applet在容器上显示某些信息,如文字、颜色、背景或图像等,在Applet的生命周期内可以多次调用。例如,当Applet页面被其他页面遮挡,然后又重新在最前端显示,以及改变浏览器窗口大小,或者Applet本身需要显示信息时,主类创建的对象都会自动调用paint()方法。其格式为:public void paint(Graphics g){……},其参数是java.awt.Graphics类的实例,通过这个参数,可以在Applet上绘图或显示文本。
当用户上网浏览一个包含Applet的网页时,由于Applet代码实际上是从远程服务器上下载到用户本地机上运行的,所以安全问题显得十分重要。Applet本身设定了相应的安全规则来保证用户的系统安全,这些规则包括:
l Applet永远无法运行本地机上的可执行程序。
l Applet除了与所在的服务器联系外,无法再同任何其他的服务器取得联系。
l Applet不能对本地文件系统进行读写操作。
l 除了本地机上使用的Java版本号、操作系统名称和版本、系统使用的特殊字符外,Applet不能获取其他有关本地计算机的信息。特别是本地系统的用户名以及Email等信息。
l Applet的弹出式窗口都会带有一个警告信息。
由于Applet是在Java虚拟机中解释执行,而不是由用户计算机的CPU直接运行,才使得这些安全规则成为可能。因为解释器会检查所有的关键指令和程序运行范围,能够防止恶意编写的Applet导致计算机崩溃、重写系统内存或改变系统权限。
在某些情况下,通过使用签名的Applet还可以针对不同的情况给予其不同级别的安全等级。被签名的Applet携带一个可以证明其签名者身份的证书,加密技术能够保证这种证书不能被伪造,如果用户信任签名者,就可以赋给Applet额外的权限。
在设计和实现Applet时应注意两个主要的方面,即用类设计和户界面设计。
类的设计即把程序的功能分解为类来描述,每个类应尽可能简单,但也应该完整,应包含所有可能的情况,在设计类时应注意代码的重用。
在设计界面时应注意:
(1)图形界面布局应符合工业标准,使用户在操作时不会感到陌生。
(2)便于操作,虽然一个Applet的功能一般较少,但多数应能响应用户的操作。
(3)要考虑格式和组合问题,格式指元素按要求排列时需要用到的版面形式,应美观、合理;组合指将类的元素集中放置在一起,便于使用和管理。
Applet类是所有Java Applet小应用程序的基类,所有Java Applet必须都继承该类,其格式为:
import java.applet.*;
public class TestApplet extends Applet{……}
Applet类的构造函数只有一种,即:
public Applet();
Applet类的常用方法如表12-1所示。
表12-1 Applet的常用方法
|
类名 |
功能描述 |
|
final void setStub(AppletStub stub) |
设置当前Applet与应用程序运行所需浏览器环境之间的接口 |
|
boolean isActive() |
判断一个Applet是否处于活动状态 |
|
URL getDocumentBase() |
检索表示该Applet运行的文件目录的对象 |
|
URL getCodeBase() |
获取该Applet代码的URL地址 |
|
String getParameter(String name) |
获取该Applet由name指定的参数的值 |
|
AppletContext getAppletContext() |
返回浏览器或小应用程序观察器 |
|
void resize(int width, int height) |
调整Applet运行的窗口尺寸 |
|
void resize(Dimension d) |
调整Applet运行的窗口尺寸 |
|
void showStatus(String msg) |
在浏览器的状态条中显示指定的信息 |
|
Image getImage(URL url) |
按url指定的地址装入图像 |
|
Image getImage(URL url, String name) |
按url指定的地址和文件名加载图像 |
|
AudioClip getAudioClip(URL url) |
按url指定的地址获取声音文件 |
|
AudioClip getAudioClip(URL url, String name) |
按url指定的地址和文件名获取声音 |
|
String getAppletInfo() |
返回Applet应用有关的作者、版本和版权方面的信息 |
|
String[][] getParameterInfo() |
返回描述Applet参数的字符串数组,通常包含参数名、值类型和说明 |
|
void play(URL url) |
加载并播放一个url指定的音频 |
|
void destroy() |
撤销Applet并释放占用资源,若Applet是活动的则先终止其运行 |
【例12-4】输出各种不同的字体。
//********** ep12_4.java **********
import java.awt.Font;
import java.awt.Graphics;
public class ep12_4 extends java.applet.Applet{
public void paint(Graphics g){
Font a=new Font("TimesRoman",Font.PLAIN,18);
Font b=new Font("TimesRoman",Font.BOLD,18);
Font c=new Font("TimesRoman",Font.ITALIC,18);
Font d=new Font("TimesRoman",Font.BOLD+Font.ITALIC,18);
g.setFont(a);
g.drawString("This is a Plain font",10,25);
g.setFont(b);
g.drawString("This is a bold font",10,50);
g.setFont(c);
g.drawString("This is a italic font",10,75);
g.setFont(d);
g.drawString("This is a bold italic font",10,100);
}
}
HTML文件为:
<applet code="ep12_4.class" width=300 height=180></applet>
运行结果如图12-4所示:
图12-4 例12_4运行结果
在Applet中使用图像文件时需要定义Image对象,通过getImage()方法把图像文件和Image对象联系起来,通过Graphics类的drawImage()方法将图像对象显示出来。为了提高图像的显示效果,大多数的Applet采用双缓冲技术,即先把图像装入内存,然后再显示到屏幕上。
装载图像时首先定义Image对象,其格式为:
Image picture;
picture=getImage(getCodeBase(),"ImageFileName.gif");
getImage方法有两个参数,第1个参数是对getCodeBase方法的调用,该方法返回Applet的URL地址,第2个参数指定从URL装入的图像文件名。如果图像文件位于Applet之下的某个目录,文件名中则应包括相应的目录路径。用getImage方法把图像装入后,Applet便可用Graphics类的drawImage方法显示图像,其格式为:
g.drawImage(Picture,x,y,this);
drawImage()方法的参数指明了要显示的图像和图像左上角的坐标并指定了一个实现ImageObServer接口的对象。
【例12-6】显示图像的例子。
//********** ep12_6.java **********
import java.awt.*;
import java.applet.*;
public class ep12_6 extends Applet{
Image picture;
public void init(){
picture=getImage(getCodeBase(),"ep12_6.gif");
}
public void paint(Graphics g){
g.drawImage(picture,50,50,this);
}
}
HTML文件为:
<applet code="ep12_6.class" width=300 height=180></applet>
运行结果如图12-6所示:
图12-6 例12_6运行结果
需要注意的是,drawImage方法不是把图像完整地装入内存后再显示的,而是一边装入一边显示图像,因而可能会产生一种不连续的现象。
12.1 简述Java Applet的开发和运行步骤。
12.2 小应用程序界面的宽度和高度一般在______文件中指定,其中用来指定宽度和高度的关键字分别是______和______。
12.3 如果一个Java程序既是应用程序又是小应用程序,那么它必定含有______类的子类,同时含有成员方法______。
12.4 JDK中提供的一个专为查看Applet的工具是______。
12.5 在Applet坐标系中,(0,0)代表输出窗口______角的像素点。
12.6 下面哪些方法不是Applet的基本方法______。
A. start() B. stop() C. init() D.kill()
12.7 关于Applet的生命周期正确的说法是______。
A. stop方法在start方法之前执行
B. init方法在start方法之后执行
C. stop方法在Applet退出时被调用,只能被调用1次
D. stop方法在Applet不可见时会被调用,可以被调用多次
12.8 下面哪个操作Applet可以完成______。
A. 读取客户端文件 B. 在客户端创建新文件
C. 读取Applet所在服务器的文件 D. 在客户端调用其他程序
12.9 下面程序代码正确的排列顺序是______。
(1)import java.applet.*;
(2)ex12_9_a()
(3)package myclasses;
(4)public class ex12_9 extends java.applet.Applet{}
A. 1、2、3、4
B. 1、3、2、4
C. 3、1、4、2
D. 1、3、4、2
12.10 利用Applet绘制一个国际象棋棋盘。
12.11 编写一个Applet,添加两个文本框和一个命令按钮。其中一个文本框接收用户输入的一行字符串,回车后在另一个文本框中重复输出三行,单击命令按钮可清空所有文本框内容。
12.12准备一组图片及相关文字说明,编写Applet制作音乐相册,要求有背景音乐和向前、向后翻动相册的按钮。