Applet
本章学习目标:
● 熟悉Applet技术
● 掌握Applet的开发步骤
● 理解Applet小程序的生命周期
● 掌握Graphics类的用法
9.1 Applet 概 述
前面已经提到过,Java语言不仅可以用来编制独立运行的Application应用程序,而且还可以用来开发Applet。事实上,Java语言最初展现给世人的就是Applet,Applet技术的出现,使互联网立刻焕发出无限的生机,因为Applet不仅可以生成绚丽多彩的Web页面、进行良好的人机交互,同时还能处理图形图像、声音、视频和动画等多媒体数据。随即Applet吸引了全世界编程者的目光,Java语言也正因此火热流行起来,可见Applet在Java的发展过程中起到了不可估量的推动作用。
Applet一般称为小应用程序,Java Applet就是用Java语言编写的这样的一些小应用程序,它们可以通过嵌入到Web页面或者其他特定的容器中来运行,也可以通过Java开发工具的appletviewer来运行。Applet必须运行于某个特定的“容器”中,这个容器可以是浏览器(如IE,FireFox,Opear,Netscape等),也可以是通过各种插件,或者包括支持Applet的移动设备在内的其他各种程序来运行。与独立运行的Java应用程序不同,Applet有自己的一套执行流程,而不是通过main方法来开始执行程序,并且在运行过程中Applet通常会与用户进行交互操作,显示动态的页面效果,并且还会进行严格的安全检查,以防止潜在的不安全因素(如根据安全策略,限制Applet对客户端机器的文件系统进行访问等)。Java Applet可以实现图形图像绘制、字体和颜控制、动画和音视频播放、人机交互以及网络通信等功能,此外,Java Applet还提供了称为抽象窗口工具箱(Abstract Window Toolkit,简称AWT)的窗口环境开发工具,AWT利用计算机的GUI技术,可以帮助用户轻松地建立标准的图形用户界面,如窗口、按钮、菜单、下拉框和滚动条等。现在,网络上已经有非常多的Applet收集站提供各种精彩范例来展现各种功能,下面列出几个网上推荐的Applet收集站,当然,读者也可以自行去搜索以欣赏Java Applet的精彩。
www.gamelan
这是Internet上最负盛名的Applet收集站,它按照小应用程序的用途加以分类,并列出了它们的说明、功能和程序代码,其规模和种类之多,令人叹为观止。
www.jars/
这个站点的特是对它收集的小应用程序都加以评分,JARS是小应用程序评价服务(Java Applet Rating Services)的缩写。许多Java开发者均以能获得其好评为荣。
www.yahoo/Computers_and_Internet/Languages/Applet/
这是Yahoo公司提供的小应用程序目录,收集的数量虽然稍逊于Gamelan,但也非常丰富。
home.n
etscape/comprod/products/navigator/version_2.0 /java_applets/
这是网景公司提供的小应用程序演示网页,同时也提供了一些Java信息。
java.wiwi.uni_frankfurt.de/
这是一个小应用程序的信息站点,提供了许多实用信息,读者可以借助这里的数据库,查询自己感兴趣的小应用程序的相关信息。
下面将重点介绍Applet的开发技术及其宿主环境——HTML(Hyper Text Markup Language,超文本标
记语言)。
9.2 Applet开发技术
9.2.1 Applet开发步骤
Applet的开发大致可以分为如下3个步骤:
(1) 用UltraEdit或Notepad等纯文本软件编辑Java Applet源程序。
(2) 利用javac编译器将Applet源程序转换成class字节码文件。
(3) 编写HTML页面,并通过<APPLET></APPLET>标签引用上述字节码文件。
下面通过一个简单的例子来说明Applet程序的开发过程。
1. 编辑Applet的java源程序
在“F:/工作目录”文件夹下创建HelloApplet.java文件。文件的源代码如下:
import java.awt.*;
import java.applet.*;
public class HelloApplet extends Applet
{
public void paint(Graphics g )
{
g.drawString("Hello!",10,10);
g.drawString("Welcome to Applet Programming!",30,30);
}
}
编写完以后保存上述程序。下面对该程序做一些简单说明:
程序开头两行的import语句是用来导入Applet小程序中用到的一些Java标准库类,类似于C语言中的i
nclude语句,多数Applet程序都会含有类似的代码,以使用JDK提供的功能;接下来在程序中定义了一个公共类HelloApplet,它通过extends继承于Applet类,并重写父类中的paint()方法,其中参数g为Graphics类的对象,代表当前绘画的上下文,在paint()方法中,两次调用g的drawString()方法,分别在坐标(10,10)和(30,30)处输出字符串“Hello!”和“Welcome to Applet Programming!”,其中的坐标是用像素点表示的,且以显示窗口的左上角作为坐标系的原点(0,0)。另外,细心的读者可能早已发现:Applet程序中没有出现main()方法。其实这正是Applet小程序与Application应用程序的重要区别之一。因为Applet小程序没有main()方法作为执行入口,因此必须将其放至在“容器”中加以执行,常见的做法是编写HTML文件,将Applet嵌入其中,然后用支持Java的浏览器或appletviewer工具来运行。
2. 编译Applet源程序
用如下命令编译HelloApplet.java源文件:
F:/工作目录/>javac HelloApplet.java<回车>
与编译独立运行的Java Application一样,如果编写的Java Applet源程序不符合Java编程语言的语法规则,即源程序中存在语法错误的话,Java编译器会给出相应的语
法错误提示信息。Applet源文件中必须不含任何语法错误,Java编译器才能成功地将其转换为浏览器或appletviewer能够执行的字节码程序。
成功编译HelloApplet.java源程序之后,系统就会在当前目录生成一个字节码文件,其名称为HelloApplet.class。
3. 编写HTML宿主文件
在运行所编写的Applet程序,即HelloApplet.class之前,还需要建立一个HTML页面,该页面的文件扩展名可以为html或htm,浏览器或appletviewer将通过该文件执行其中的Applet字节码程序。
文件名为HelloApplet.html的Web页面的代码如下。
<HTML>
<TITLE>Hello Applet</TITLE>
<APPLET CODE="HelloApplet.class" WIDTH=300 HEIGHT=300>
</APPLET>
</HTML>
上述HTML代码中,用尖括号< >括起来的都是标签,一般都是成对出现的,前面加斜杠的表明标签
结束。可以说,HTML文件基本上就是由各种各样的标签组成的,每种标签都有其特定的含义,都能表达某种信息,在后面的小节中将有具体介绍,这里只简单介绍一下<APPLET>标签,<APPLET>标签至少需要包括以下3个参数。
● CODE:指明该Applet字节码文件名。
● WIDTH:指定Applet占用整个页面的宽度,以像素点作为度量单位。
● HEIGHT:指定Applet占用整个页面的高度,以像素点作为度量单位。
通过<APPLET></APPLET>标签对就可以将Applet的字节码文件嵌入其中,需要注意的是:字节码文件名要么包含具体路径,要么与HTML文件处于同一目录中,否则可能会出现加载Applet字节码失败的错误。
这里的HTML文件使用的文件名为 HelloApplet.html,它对应于HelloApplet.java的名字,但这种对应关系不是必须的,可以用其他的任何名字(比如test.html)命名该HTML文件。但是使文件名保持一种对应关系会给文件的管理带来一些方便。
4. 运行HelloApplet.html
如果使用appletviewer来运行HelloApplet.html,则需要输入如下命令:
F:/工作目录/>appletviewer HelloApplet.html<回车>
运行结果如图9-1所示。
图9-1 使用appletviewer运行HelloApplet.html
如果用浏览器运行HelloApplet.html,则双击该网页将自动打开,显示结果如图9-2所示。
图9-2 使用浏览器运行HelloApplet.html
开发运行Applet程序的整个过程就是这样的,包括java源文件编辑、编译生成字节码class文件、编写html文件以及用appletviewer或用浏览器运行。下面接着对Applet的具体技术进行详细的介绍。
9.2.2 Applet技术解析
在Applet小程序最前面的加载语句中,分别导入了Java的系统包applet和awt,通常每一个系统包下都会包含一些Java类,比如import java.applet.*可以导入如图9-3所示的所
有Java类。
图9-3 系统包java.applet.*中的class文件
类是面向对象程序设计的核心概念,Java系统预先提供了很多类来协助用户开发程序,用户可以直接引用这些类而不必自己实现。编写Java Applet小程序一定要用到Applet基类,在上图中可以到这个类,它是用户自定义applet类的基类(也称父类),用关键字extends来对其进行继承。另外,Applet小程序通常都需要使用到图形界面元素,这就要加载awt包,其对应路径下包含了很多的处理图形界面的类,如图9-4所示。
图9-4 awt包中的class
Applet类是用户编写的applet小程序的基类,该类的继承关系如图9-5所示。
图9-5 Applet类的继承关系图
Applet类中有不少成员方法,下面列出其中常用的一些方法及其功能。读者也可以通过反编译工具打开Applet.class进行查看。
(1) public final void setStub(AppletStub stub) //设置Applet的stub是Java和C之间转换参数并返回值的代码位,它由系统自动设定。
(2) public boolean isActive() // 判断一个Applet是否处于活动状态。
(3) public URL getDocumentBase() //检索该Applet运行的文件目录的对象。
(4) public URL getCodeBase() // 获取该Applet代码的URL地址。
(5) public String getParameter(String name) // 获取该Applet由name指定参数的值。
(6) public AppletContext getAppletContext() // 返回浏览器或小应用程序观察器。
(7) public void resize(int width,int height) // 调整Applet运行的窗口尺寸。
(8) public void resize(Dimension d) // 调整Applet运行的窗口尺寸。
(9) public void showStatus(String msg) // 在浏览器的状态条中显示指定信息。
(10) public Image getImage(URL url) // 按url指定的地址装入图像。
(11) public Image getImage(URL url,String name) // 按url指定的地址和文件名加载图像。
(12) public AudioClip getAudioClip(URL url) // 按url指定的地址获取声音文件。
(13) public AudioClip getAudioClip(URL url, String name) // 按url指定的地址和文件名获取声音。
(14) public String getAppletInfo() //返回Applet有关的作者、版本和版权信息。
(15) public String[][] getParameterInfo() //返回描述Applet参数的字符串数组,该数组通常包含3个字符串:参数名、该参数所需值的类型和该参数的说明。
(16) public void play(URL url) //加载并播放一个url指定的音频剪辑。
(17) public void init() //该方法主要是为Applet的正常运行做一些初始化工作。
(18) public void start() //系统在调用完init()方法之后,将自动调用start()方法。
(19) public void stop() //该方法在用户离开Applet所在的页面时执行,可以被多次调用。
(20) public void destroy()
//用来释放资源,在stop( )之后执行。
细心的读者可能会注意到Applet类中并没有public void paint(Graphics g )方法,那么paint()方法就应该是从Applet类的父类中继承而来的,首先我们查直接父类Panel,也没有发现paint()方法,接着继续查Container父类,这时就到了,可见paint()方法是由awt组件类定义的,该方法用来为Applet绘制图像或者输出某些信息。
Applet小程序的生命周期相对于Application而言较为复杂。在其生命周期中涉及到Applet类的4个方法:init()、start()、stop()和destroy(),Applet的生命周期中有相对应的4个状态:初始态、运行态、停止态和消亡态。当程序执行完init()方法后,Applet小程序就进入了初始态;然后立刻执行start()方法,Applet小程序进入运行态;当Applet小程序所在的浏览器图标化或者是转入其他页面时,该Applet小程序立刻执行stop ()方法,使Applet小程序进入停止态;在停止态中,如果浏览器又重新加载该Applet小程序所在的页面,或者是浏览器从图标中还原,则Applet小程序又会调用start()方法,进入运行态;不过,在停止态时,若浏览器被关闭,则Applet小程序会调用destroy()方法,使其进入消亡态。
1. init()方法
当Applet小程序第一次被加载执行时,便调用该方法,并且在小程序的整个生命周期中,只调用一次该方法,一般在其中进行一些初始化操作,如处理由浏览器传递来的参数、添加图形用户界面的组件、加载图像和音频文件等。另外需要说明的是:Applet小程序虽然有默认的构造方法,但它习惯于在init()方法中进行初始化操作,而不是在默认的构造方法内。该方法的代码格式如下:
public void init( )
{
//编写代码
}
2. start()方法
系统在执行完init()方法后,将自行调用start()方法,并且每当浏览器从图标还原为窗口时,或者当用户离开包含该Applet小程序的页面后又返回时,系统都将重新执行一遍start()方法,因此start()方法在小程序的生命周期内可能会被调用多次,这一点是与init()方法不同的,此外,该方法通常作为Applet小程序的主体,在其内可以安排一些需要重复执行的任务或者重新激活一个线程,如打开一个数据库连接、播放动画或是启动一个播放音乐的线程等。该方法的格式如下:
public void start( )
{
//编写代码
}
3. stop()方法
与start()方法相反,当用户离开Applet小程序所在的页面或者浏览器图标化时,系统会自动调用stop()方法,因此,该方法在Applet小程序的生命周期内也可能被多次调用。这样处理的好处是:当用户不再使用Applet
小程序的时候,停掉一些耗用系统资源的任务(如断开数据库的连接或是中断一个线程的执行等),以提高系统的运行效率,况且这也并不需要人为地去干预。假如Applet小程序中不需要包含打开数据库连接或者播放动画、音乐等代码时,也可以不重载该方法。该方法的格式如下:
网页设计html代码大全继承关系 public void stop( )
{
//编写代码
}
4. destroy()方法
当浏览器或其他容器被关闭时,Java系统会自动调用destroy()方法。该方法通常用于回收init()方法中初始化的资源,在调用该方法之前,肯定已经调用了stop()方法,我们可以按照如下格式来书写destroy()方法:
public void destroy( )
{
//编写代码
}
除了上述4个方法以外,由AWT组件类定义的paint()方法也是Applet程序中的常用方法。
5. paint()方法
Applet小程序的窗口绘制通常是由paint()方法来完成的。paint()方法在小程序执行后会被自行调用,并且在遇到窗口最小化后再恢复或者被其他窗口遮挡后再恢复时,它都会被自动调用,以重新绘制窗口。paint()方法有一个Graphics类的参数对象,该对象可以被用来输出文本、绘制图形、显示图像等。该方法的格式如下:
public void paint(Graphics g)
{
//编写代码
}
下面的例9-1演示了Applet小程序生命周期中的这几个常见方法的使用情况。
【例9-1】Applet的方法示例。
import java.awt.*;
import java.applet.*;
public class DemoApplet extends Applet
{
public void init( )
{
System.out.println("init()方法");
}
public void start( )
{
System.out.println("start()方法");
}
public void paint(Graphics g)
{
System.out.println("paint()方法");
}
public void stop( )
{
System.out.println("stop()方法");
}
public void destroy( )
{
System.out.println("destroy()方法");
}
}
将上述Applet小程序编译后嵌入HTML页面,并用appletviewer加以执行,则程序的控制台将输出如下信息:
init()方法
start()方法
paint()方法
paint()方法 //将Applet变为非活动窗口后再变回来增加的控制台输出
stop()方法 //将Applet图标化后增加的控制台输出
start()方法 //将Applet图标恢复后增加的控制台输出
paint()方法 //将Applet图标恢复后增加的控制台输出
stop()方法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论