Applet程序设计
【原文地址】 http://blog.csdn.net/flyuniverse_shell/article/details/4731103
本章目录
6.1 Applet基本概念
6.2 编写Applet程序
6.3 Applet多媒体设计
6.4 Applet的交互功能与通信功能
6.1 Applet基本概念
本章介绍Java语言的另一种程序,即Java小应用程序Applet。
一、什么是Applet?
Applet是Java语言与WWW相结合的产物,是一种被嵌入到Web页中,由Java兼容浏览器执行的小程序,可以生成具有动态效果和交互功能的Web页,其主要特点有:
◆ 绘图功能
◆ 动态效果
◆ 动画和声音
◆ 交互功能
◆ 窗口环境
◆ 网络交流能力
Applet是Java语言程序的一种特殊形式,从语法上看,Application的语法完全适用于Applet,包括语句、方法和图形界面设计技术等,二者之间的差异在于Applet是在浏览器环境
下运行的。Applet的应用是目前Java语言应用的重要内容,在Internet上可以浏览到数量惊人的Applet程序,其设计丰富多彩,千变万化,极大地丰富了WWW页面的内容。
二、Applet的运行环境和运行方式
Applet本身是一段Java程序,但它不能独立运行,需经过编译后成为字节码文件嵌入到HTML文本中,通过主页发布到Internet上。用户从网上访问主页打开HTML文本时,Applet被
用户浏览器执行起来。Applet自身无法以命令行方式启动,需要依赖浏览器为其提供图形界面,并且要求浏览器必须是Java兼容浏览器才行。
Java类库的java.applet包中定义了一个Applet类,Applet类被定义为面板Panel类的子类,是一个非独立的容器,必须被放到一个独立容器中才能执行。用户在编写Applet程序的
时候,程序的主类必须被声明为继承自Applet类,通常情况下或者是将主类声明为Applet类的直接子类,或者是将主类声明为Applet类的子类、Swing组件中的一个顶层容器
JApplet类的直接子类。
三、Applet的执行步骤和生命周期
当Java兼容浏览器发现Web页中有Applet时,将通过网络从Applet宿主机上下载Applet程序的主类,并引入其他必要的类,随后在Java兼容浏览器中生成Applet主类的一个对象实例
。同一Web页上的不同Applet主类,以及不同Web页上的Applet主类都会生成不同的对象实例,运行在同一浏览器上的各个Applet程序具有独立的行为。对于Applet而言,浏览器便
是Java运行时系统。
Applet的生命周期是指自Applet程序被下载直至它被系统回收所经历的历程。在这个历程中,有以下事件能够改变Applet的状态。
⒈下载Applet:可以产生一个Applet主类的实例,并对其进行初始化,启动Applet。
⒉离开或返回Applet所在的主页:离开网页或图标化浏览器窗口可使Applet停止运行,返回主页或恢复浏览器窗口可使Applet程序重新启动。
⒊退出浏览器:退出浏览器将使Applet程序停止自身执行,并进行善后处理。
四、Applet的安全机制
由于Applet是通过网络传递并且要经过下载才能被执行的程序,令人非常容易想到安全问题,即病毒传播、系统破坏和通过网络泄露用户端的有关信息等问题,如编写恶意代码通
过Applet程序盗取用户的保密信息并进行传播等。
Java语言提供了一个SecurityManager类用来防止发生上述类似事件,它几乎可以控制Java虚拟机的所有系统级调用,这一整套用来防止各种不安全事件的安全机制被称为“沙箱”
安全机制。对于所运行的Applet程序有以下约束:
⒈Applet只能通过网络通讯将数据写入其宿主机上的应用程序中,由应用程序完成宿主机上的文件写;
⒉Applet不能通过套接字与非宿主机进行网络通讯;
⒊Applet不能在运行它的主机上进行正常的文件操作;
⒋Applet不能调用运行主机上的任何程序。
6.2 编写Applet程序
一、Applet的主要行为
Java语言Application程序在执行时必须首先调用main()方法,进入main()方法之后即开始生成各种对象实例,并通过对象实例调用各个方法成员,待每一个执行过程结束之后,再
依次返回main()方法,这样main()方法成为Application程序的执行入口和出口。
Applet程序的执行过程与Application程序的执行过程有很大的不同,它不包含main()方法,也没有类似的明确的入口与出口。Applet程序也可以包含若干个类,其中也有一个主类
,其程序内容和执行过程则是通过主类中的以下几个方法实现的。
⒈初始化方法init():此方法是在Applet被浏览器下载时被执行的,在Applet的整个生命周期中只须执行一次。
⒉启动方法start():系统在调用完init()方法之后将自动调用start()方法,此后每当返回Applet所在的主页或是恢复浏览器窗口时系统都将调用一次start()方法。该方法中包含
Applet的主体内容。
⒊停止方法stop():每当离开Applet所在的主页或是图标化浏览器窗口时系统都将调用一次stop()方法。
⒋删除方法destroy():当浏览器将关闭时系统将调用destroy()方法杀死所有Applet线程、释放系统资源并进行善后处理,该方法在Applet的整个生命周期中只须执行一次,且是
整个生命周期中调用的最后一个方法。
⒌绘制方法paint(Graphics g):当Applet程序需要在界面上显示某些文字、图形、图像、色彩等等信息时,就需要调用此方法来完成绘制任务,有时为了使程序对于界面上的更新
能够快速响应,还需要多次调用此方法。
显然start()方法与stop()方法都可以被多次调用,并且两种方法是穿插调用的,每一次对stop()方法的调用都是在一次对start()方法的调用之后。
二、Applet编程
程序员在进行Applet程序编程的时候主要要完成三件事:第一是把Applet程序的主类声明为Applet类的直接子类或者是JApplet类的直接子类;第二是把要执行的相关代码通过重写
初始化方法、启动方法、停止方法、删除方法和绘制方法等方法写入Applet程序中;第三是如果需要的话还要再写出Applet程序的主类的其它方法成员及其它的非主类。
由于Applet程序的主类必须要被声明为Applet类或JApplet类的直接子类,这样,Applet程序的主类就不能再继承Applet类或JApplet类以外的类。
在Applet程序中,语句、语法、对象实例等等语言内容与编写Application程序是一样的,在其所包含的类中可以根据需要实现各种接口,也可以使用GUI界面设计技术。
通常情况下,用户主要是根据程序的实际情况重写几个主要的方法成员,大多数情况下仅需重写init()方法和start()方法,需要界面操作时重写paint()方法,stop()方法需要重
写的情形就少一些,而除非特殊情况,很少重写destroy()方法。
带有按钮的具有嵌套布局的Applet程序的简单例子。
例6.1
//Example 1 of Chapter 6
import
import
public
{
}
三、Applet标记
当一个完整的Applet程序完成以后,就应当运行它。在运行Applet程序时需要将这个Applet程序编译成字节码文件,然后嵌入到HTML文本中作为Web页的一部分发布到Internet上。
嵌入Web页的办法是在HTML文本中采用Applet的有关标记。
HTML文本分为HEAD部分和BODY部分,Applet标记 指明所描述的内容是一个Applet,这一对标记不是标准的HTML标记,只有Java兼容浏览器才支持它,使用时这
一对标记要放在文本的BODY部分,大致格式如下
在“
”标记中可以给出多种可以描述Applet程序的属性:
⒈archive = archiveList,描述存档文件。
⒉code = AppletFile.class,这个属性是必须给出的,代表编译好的Applet程序的字节码文件的文件名,应该是一个相对地址。
⒊width = pixel和height = pixel,这两个属性也是必须要给出的,描述Applet程序显示的初始宽度和高度,此区域仅是Applet程序显示的范围,不包括显示所用的窗口的标题和
边框。
⒋codebase = codebaseURL,代表Applet程序的字节码的基地址,即包含着Applet代码的目录,缺省为当前HTML的URL地址。
⒌alt = alternateText,代表替代文本,即当浏览器不能正确显示Applet或不支持Applet时,将会显示该属性设置的文本。
⒍name = AppletInstanceName,这个属性为当前Applet设置了一个名字,以便同一个主页上的其它Applet能够发现和识别它从而实现相互之间的通讯。
⒎align = alignment,指定Applet显示区的对齐方式,取值范围为:left,right,top,texttop,middle,absmiddle,baseline,bottom,absbottom。
⒏vspace = pixel和hspace = pixel,指定Applet显示区的纵向和横向边缘空出的宽度。
⒐< param name = appletAttribute value = value >,这个标记是在“
”标记之间的一个属性,可以写上多条,其中的属性名和属性值可以被
Applet类中的getParameter()方法所获取。JDK提供了一个简易的Applet运行器Appletviewer,可以替代浏览器用来运行和调试Applet。Appletviewer可以以命令行方式执行,可以
略去HTML文本中的其他内容而仅仅显示Applet。命令行执行格式为Appletviewer
也可以从网上的HTML文本中迅速找到Applet。
//Example 2 of Chapter 6
import
import
import
public
{
}
四、Applet类与JApplet类
Applet类定义在java.applet包中, JApplet类定义在javax.swing包中。使用JApplet作为主类的直接父类能使所编写的Applet程序兼容Swing组件。
在Applet类中定义的方法成员主要有以下几个:
Applet基本方法destroy()、init()、start()、stop(),获取图像和声音的方法getImage()、getAudioClip(),获取当前Applet信息的方法getAppletContext()、getAppletInfo()
,获取当前Applet及其所在文档的URL的方法getCodeBase()、getDocumentBase(),获取HTML文件中参数值的方法getParameter()、getParameterInfo(),声音播放方法play()等。
在JApplet类中,为了能够兼容Swing组件及支持Swing组件新增功能,又增加了一些专门用来进行Swing组件操作的方法:
创建默认rootPane方法createRootPane(),返回此applet的contentPane对象方法getContentPane(),获取菜单栏设置方法getJMenuBar() ,返回此applet的layeredPane对象
getLayeredPane(),返回此applet的rootPane对象getRootPane(),设置contentPane属性setContentPane(),设置此applet的菜单栏setJMenuBar(),设置layeredPane属性
setLayeredPane(),设置rootPane属性setRootPane(),从容器中移除指定组件remove()。
//Example 3 of Chapter 6
import
import
import
import
public
{
}
6.3 Applet多媒体设计
Applet中可以使用Java语言中的全部AWT组件和工具,包括事件和监听器等来构造一个完整的界面。
显示图形界面要用到几个与显示有关的方法,其原型如下
public
public
public
在这里用到了Graphics类参数,Graphics类是一个处理各种图形对象的基本抽象类,是Object类的直接子类,其中定义了很多称为绘图原语的方法成员,用来完成基本图形绘制和
画图像等两种绘图,该类是绘图的关键。Applet程序中如果要进行图形化操作,必须用形如import
//Example 4 of Chapter 6
import
import
import
public
{
}
AWT绘图工作通常由一个AWT线程来控制完成,该线程负责两种界面显示工作:
一种是当一个界面刚刚生成以及界面中有被遮挡和破坏部分需要恢复时,此时系统将调用paint()方法;
一种是系统更新显示内容决定重画显示区域时,要调用repaint()方法。
paint(Graphics
重写,将具体的执行动作写入方法体中。paint()方法一般是Applet程序中必不可少的成员。
二、update(Graphics
三、repaint(long
般也无需重写。
一、图形绘制
在Graphics类中定义了多个方法实现了绘图原语,用以绘制各种基本几何图形,如画线drawLine(),画矩形drawRect()、fillRect(),画立体矩形draw3DRect()、fill3DRect(),
画椭圆drawOval()、fillOval(),画弧drawArc(),画多边形drawPolygon()、fillPolygon()等,利用这些方法成员可以绘制出用户所需的图形。
二、字符串绘制
在Graphics类中定义了一个方法drawString(String
三、图像绘制
Java类库中定义了一个java.awt.Image类,在程序中每个具体的图像文件都被看做是该类的一个对象实例。Java语言中支持GIF、JPEG、PNG格式的图像,Applet类方法
public
public
可以得到一个包含图像文件的Image类对象,之后可以用Graphics类方法drawImage()实现图像的显示绘制。
除此之外,也可以使用ImageIcon类实现图像的绘制。由于Image类是抽象类,不能直接初始化,必须用getImage()方法获取实例,并用drawImage()方法绘制,而ImageIcon类可以
直接用构造方法初始化,并用该类的方法成员paintIcon()方法绘制图像,相比之下,后一种方法用ImageIcon类绘制图像更方便一些。
图形绘制、字符串绘制和图像绘制的有关语句在程序中都要写在Applet程序的paint()方法中。
四、动画绘制
Applet中实现动画的基本思路是通过在同一位置上按一定时间间隔显示连续画面的方式实现动画功能,画面可以是图像,也可以是图形。实现动画的主要问题是控制好画面的刷新
时间,如果慢了将出现闪烁,过快也没有必要。一般取值在1/10~1/20秒之间,如果刻意追求动画效果也可以取1/8秒,连续画面可以取1/25秒。
//Example 5 of Chapter 6
import
import
import
public
{
}
五、声音播放
有两种可以在Applet程序中播放声音的方法,一种是利用AudioClip接口的几个方法成员实现,另一种是利用Applet类中的play()方法实现。
在java.applet包中定义了一个AudioClip接口,这是一个声音接口,声音文件可以看成是该接口的一个对象,其中的三个方法成员
public void play()
public void loop()
public void stop()
可用来播放声音。
在Applet类中定义了以下与声音有关的方法:
getAudioClip(URL url)
getAudioClip(URL url, String name) //返回由参数URL和name指定的AudioClip
play(URL url)
play(URL url, String name)
也可以用来实现声音片段的播放。
实际编写程序时,总是把声音文件与HTML文档、字节码文件放在一起,所以当需要提供URL的时候,可以使用Applet类中的getDocumentBase()方法或者是getCodeBase()方法得到。
Java语言用来播放声音文件的引擎支持如下几种音频文件格式:Sun Audio文件格式(.au)、Windows Wave文件格式(.wav)、Macintosh AIFF文件格式(.aif)以及MIDI文件格
式(.mid或.rmi)。
可以在Applet中同时播放多个声音片段,听到的则是它们的混合音。
Java语言多媒体功能实际上远不止这些,早在1998年Sun公司就制订了Java Media APIs,用以增强Java语言对多媒体的支持,其中包括:
Java 2D API
Java 3D API
Java Advanced Imaging API
Java Media Framework API
Java Sound API
Java Speech API
Java Telephony API
等。
//Example 6 of Chapter 6
import
import
import
import
import
public
{
}
6.4 Applet的交互功能与通信功能
一、Applet的交互功能
Applet程序可以通过处理事件支持交互功能,从而实现具有交互功能的网页。可以在Applet程序的类中实现监听器接口,重写接口的方法成员而实现该功能。
二、读取HTML参数
Applet类中提供了一个getParameter(String
//Example 7 of Chapter 6
import
import
import
import
import
public
{
}
三、Applet与其他程序的通信
在Web页中的Applet不仅是可独立执行的Java程序,而且可以与其他各种服务程序进行通信,目前的Applet程序能够完成下述三种方式的程序间的通信:
⒈通过请求同一Web页上其他Applet程序中的公有方法,实现与同一Web页上其他Applet程序的通信;
⒉通过使用定义在java.applet包中的API,以受限方式与包含自身的浏览器通信;
⒊通过使用定义在java.net包中的API利用网络与运行在该Applet程序的宿主机上的程序通信。
关于这些通讯的细节,请参照有关的资料。
四、Application与Applet的简要比较
相同之处:
◆
◆
◆
不同之处:
Application
◆完整的高级语言程序
◆运行在Java运行时系统的解释器上
◆可以进行正常的读写操作
◆不能演播声音
◆不能显示HTML文本
Applet
◆不是完整的程序
◆运行在Java兼容浏览器中
◆读写能力受到很大限制
◆可以演播声音
◆可以显示HTML文本