课题名称 |
第九讲 Java Applet概述 |
||
教学提示 | 本讲介绍掌握Java Applet程序的基本形式、生命周期、Applet标记及Java Applet程序的设计方法和运行环境。 | ||
教学目的 |
1. 掌握Java Applet程序的基本形式、生命周期、Applet标记 2. 熟练掌握Java Applet程序的设计方法和运行环境 |
||
重点 |
Java Applet程序的设计方法 |
难点 |
Java生命周期的概念 |
教学方法 | 案例教学法,任务驱动教学法 | 教学手段 |
幻灯片与投影示例 |
教学内容 第九讲 Java Applet概述 9. 1什么是Java Applet Java Applet 是另一类非常重要的Java程序,虽然它的源代码编辑与字节码的编译生成过程与Java Application相同,但它却不是一类可以独立运行的程序,相反,它的字节码文件必须嵌入到另一种HTML语言的文件中,并由负责解释HTML文件的WWW浏览器充当解释器,来解释执行Java Applet的字节码程序。 9.1.1 一个最简单的Java Applet 首先看一个最简单的Java Applet程序: 【例9.1】HelloApplet.java import java.applet.*; //将java.applet 包中的系统类引入本程序 import java.awt.*;//将java.awt包中的系统类引入本程序 public class HelloApplet extends Applet{ public void paint(Graphics screen){ screen.setColor(Color.red); screen.drawString("你好,Java世界!",2,20); } } 先编译生成HelloApplet.class文件,然后建立一个网页文件HelloApplet.html,如下: <html> <head><title>我的第一个JavaApplet程序</title></head> <body> <applet code="HelloApplet.class" width=300 height=200> 这里将显示一个applet小程序 </applet> </body> </html> 将该html文件放在与class文件相同的目录下,用支持Java的浏览器如IE或Netscape打开,“你好,Java世界!”显示在屏幕左上角,效果如图9.1(a)所示。
图9.1(a)HelloApplet程序在IE浏览器中的执行结果
图9.1(b)HelloApplet程序在小程序查看器中的执行结果 对于HelloApplet.html文件和编译生成HelloApplet.class文件,也可以使用Java的小程序查看器appletviewer来测试。在DOS窗口,进入该html文件所在的目录,键入如下命令: appletviewer HelloApplet.html 效果如图9.1(b)所示。 下面我们分析一下HelloApplet.java程序的结构。 首先,HelloApplet.java程序的第1、2行利用关键字import引入了程序需要用到的两个系统类。这两个系统类分别位于不同的系统包中,所以引用时需要指明它们所在的包名。 第3行声明了一个名为HelloApplet的用户自定义类。与Java Application相同,Java Applet程序也是由若干个类定义组成,而且这些类的定义也都是由class关键字标志的。但是Java Applet中不需要用main方法,它要求的是程序中有且必须有一个类是系统类Applet的子类,也就是必须有一个类的类头部分以extends Applet结尾,如:public class HelloApplet extends Applet,表示HelloApplet类是系统类Applet的子类。 在HelloApplet 类体中定义了一个方法paint。实际上,paint方法是系统类Applet中已经定义好的成员方法,它与其他的一些Applet中的方法一样,能被WWW浏览器识别,并在恰当的时刻自动调用,所以用户程序定义的Applet子类只需继承这些方法并按具体需要改写其内容(这个过程称为“重载”),就可以使WWW浏览器在解释Java Applet程序时通过自动执行用户改写过的成员方法,例如paint方法,来实现用户程序预期的功能。 9.1.2 Java Applet的运行方式 1.运行方式 Java Applet与应用程序的区别在于它们的运行方式不同。应用程序是由Java解释器通过装载其主类文件来运行的,程序入口是主类文件中的main方法。而Java Applet是运行在支持Java的浏览器上,如Netscape Navigator、Microsoft IE、Opera和Sun的HotJava浏览器。 Java Applet也可以使用Java2 SDK中的appletviewer(小程序查看器)来测试。在DOS窗口,进入该html文件所在的目录,键入如下命令: appletviewer <html文件名> 所有的Java Applet程序中都必须有一个系统类Applet的子类。系统类Applet中已经定义了很多的成员域和成员方法,它们规定了Applet如何与执行它的解释器――WWW浏览器配合工作,所以当用户程序使用Applet的子类时,因为继承,这个子类将自动拥有父类的有关成员,从而使WWW浏览器顺利地执行并实现用户程序定义的功能。 Applet的运行过程可以用图9.2来表示,首先将编译好的字节码文件和编写好的HTML文件(其中包含字节码文件名)保存在Web服务器的合适路径下;当WWW浏览器下载此HTML文件并显示时,它会自动下载HTML中指定的Java Applet字节码,然后调用内置在浏览器中Java解释器来解释执行下载到本机的字节码程序。
图9.2 Java Applet执行过程 2.<Applet>标记 <Applet>标记是HTML标记的一种扩展,用于将小程序放置到Web页中,并控制其相对于Web页其他部分的显示效果。支持Java的浏览器使用该标记中的信息来查找并执行编译后的小程序类文件(.class)。 所有关于小程序的参数和属性设置必须位于标记块<Applet>和</Applet>之内(或者<Object></Object>)。当用户使用支持Java的浏览器装载包含小程序的Web页时,该浏览器将从Web服务器下载该小程序,然后使用Java解释器在用户的系统上运行它。 【例9.2】标记块<Applet>和</Applet>之内的参数和属性设置。 <html> <head> <title> Example Applet </title> </head> <body> <applet archive ="archiveName.jar" codebase = "." code = " Example.class" name = " Example" width = 400 height = 300 hspace = 0 vspace = 0 align = "middle"> <param name = "param1" value = "value1"> This program requires a Java-enabled browser, if not, the Applet cannot be viewed. </applet> </body> </html> 这些参数和属性的含义是: archive: 小程序运行所需的jar文件。 code: 小程序的主类文件名。 codebase: 相对于class文件的相对地址或绝对URL地址,“.”表明class文件与HTML文件位于相同的文件夹中。 name: Applet内部通信参数的名称,可以显示在浏览器的状态栏。 width: 小程序窗口的宽度。 height: 小程序窗口的高度。 hspace: 小程序同周围文本之间的水平间距(单位为像素)。 vspace: 小程序同周围文本之间的垂直间距(单位为像素)。 align: 小程序相对于Web页其他部分的对齐方式,有以下八种取值:Left、Right、TextTop、Top、AbsMiddle、Middle、BaseLine、AbsBottom。 param: Applet运行所需的参数。 其中,属性width和height是必不可少的,因为Web浏览器需要知道Web页中的多大空间将用于该小程序,以免在小程序窗口外的区域中绘图。在最简单的情况下,<Applet>标记使用width和height属性来创建一个大小合适的区域,然后在其中装载并运行该小程序。 属性code和codebase用于指出小程序的主类文件和其他文件的位置。支持Java的浏览器从Web服务器下载小程序并试图运行它时,将使用这些属性。code指出了小程序的主类文件名(必须使用文件扩展名.class),如果使用code时没有同时使用codebase,将从小程序所属的Web页所在的文件夹中下载类文件。属性codebase让浏览器在另一个文件夹中查找小程序及其使用的文件,codebase指出了一个文件夹或网站地址,从这些地方可以装载类和其他文件。例如: 从Web页所在的文件夹中装载Example.class类: <applet code="Example.class" width=400 height=400> </applet> 从文件夹firstApplet中装载Example.class类: <applet code="Example.class" codebase="firstApplet" width=400 height=400> </applet> 下面的标记从另一个站点下载Example.class类文件: <applet code="Example.class" codebase="http://www.myweb.com/javaApplet" width=400 height=400> </applet> Java存档文件(JAR文件)是将主类、助手类和其他文件打包成一个文件。不使用jar文件时,对于小程序所需的每个文件(包括助手类、图像、音频文件、文本文件等),都需要在Web浏览器与包含该文件的服务器之间建立一条连接,用户需等待较长的时间。通过使用jar文件,浏览器只需与服务器建立一条连接,因此可提高下载并运行小程序的速度。 可在标记<applet>和</applet>之间包含文本、图像和其他Web页元素。当浏览器不支持Java时将显示这些内容,通过这种方式可以告诉人们:因为浏览器不支持Java,因此Java Applet没有被执行。如果不在<applet>和</applet>之间包含任何内容,则不支持Java的浏览器将不会在小程序所在的位置显示任何内容。 9.2 Applet的基本用法 9.2.1 java.Applet包简介 java.Applet包包括一个类和三个接口:类Applet和接口AppletContext、AppletStub、AudioClip。在设计applet程序时,所有的applet必须继承Applet类,类Applet提供了小应用程序及其环境之间的标准接口。 1.类Applet Applet类的层次结构如下: java.lang.Object
+ -- java.awt.Component
+ -- java.awt.Container
+ -- java.awt.Panel
+ -- java.applet.Applet
2.成员函数介绍 void destroy()方法:由浏览器调用,用来回收当前applet及其占用的系统资源。在调用本方法前通常先调用stop()方法。Applet的子类可以通过重写本方法使applet在被回收之前执行特定的操作。例如使用线程的applet可以通过init()创建线程,通过destroy()方法来杀死线程。 AppletContext getAppletContext()方法:返回当前applet的上下文,使applet可以查询和影响运行时所处的环境。 String getAppletInfo():返回当前applet的信息,如applet的作者、版本、版权等。 AudioClip getAudioClip(URL url)方法:返回指定URL地址(绝对地址)所提供的AudioClip对象。当applet试图播放该声音片断时,数据被下载。 AudioClip getAudioClip(URL url, String name) 方法:返回指定URL地址所提供的AudioClip对象。参数name指出声音片断的相对地址,与参数url提供的基地址组合在一起就是完整的URL地址。 URL getCodeBase()方法:返回当前applet的.class文件的URL地址。 URL getDocumentBase()方法:返回装载当前applet的HTML文件的URL地址。 Image getImage(URL url)方法:返回URL地址(绝对地址)指定的图形对象。当applet试图显示该对象时,数据将被下载。 Image getImage(URL url, String name) 方法:获取并返回可以被显示在屏幕上的图像对象。参数url是基地址,name是图像的相对地址,两者结合构成完整的URL地址。 String getParameter(String name) 方法:返回HTML文件中指定参数所对应的值。 String[][] getParameterInfo()方法:返回当前applet参数信息的字符串二位数组。字符串二位数组的每个基本元素都包括三个字符串:名称、类型以及描述信息。 public void init()方法:由浏览器调用,用来通知applet已经被装载到系统中。Applet的子类可以通过重写本方法使applet完成初始化工作,包括创建所需要的对象、设置初始状态、装载图像或字体、设置参数等。例如使用线程的applet可以通过init()创建线程,通过destroy()方法来杀死线程。 Boolean isActive()方法:判断当前applet是否出于活动状态。随着start()方法的调用applet将被标记为活动状态;当stop()方法被调用后,applet将立即转为非活动状态。 void play(URL url) 方法:根据参数提供的URL地址播放声音片断。若无法找到该声音片断,则本方法将不做任何事情。 void play(URL url, String name) 方法:根据参数提供的URL地址播放声音片断。若无法找到该声音片断,则本方法将不做任何事情。url指出基地址,name是相对地址,两者结合构成完整的URL地址。 void resize(Dimension d)方法:根据新尺寸调整applet的大小。 void resize(int width, int height) 方法:根据长、宽调整当前applet的大小。 public final void setStub(AppletStub stub) 方法:设置当前applet的存根,它由系统自动调用。 void showStatus(String msg) 方法:在状态窗口中显示参数字符串的内容。许多浏览器提供了状态窗口,使用户可以即时获取当前状态信息。 public void start()方法:由浏览器调用,用来通知applet可以开始执行。当调用init()方法后以及每次applet被重新访问时调用本方法。Applet的子类可以通过重写本方法使applet每次被访问时执行特定的操作。例如,对于一个完成动画功能的applet可以使用start()方法来重新开始动画演示,使用stop()方法将动画线程挂起。 public void stop()方法:由浏览器调用,用来通知applet停止执行。当用户离开Web主页或调用destroy()方法前调用本方法。Applet的子类可以通过重写本方法使applet每次停止时执行特定的操所。例如,对于一个完成动画功能的applet可以使用start()方法来重新开始动画演示,使用stop()方法将动画线程挂起。 9.2.2 Java Applet的方法与生命周期 在一个Applet的生命周期中,共有4种状态和4个方法:init()、start()、stop()和destroy()。
图9.3 Applet生命周期与主要方法 初始化方法init()在小程序被装载时发生,该方法在Applet的生命周期中只执行一次。初始化包括创建小程序所需要的对象、设置初始状态、装载图像和字体、设置某些参数。初始化小程序时,一项很重要的工作是设置背景窗口的颜色,用setBackground(Color color)。 小程序初始化后,浏览器将调用start()方法启动程序。小程序被终止后,也可以将它重新启动。例如,如果用户单击超链接进入其他页面,则小程序将停止;当用户回到包含该小程序的页面时,它会被再次启动。在小程序的生命期中初始化只发生一次,但可以启动多次。 加入start()方法中的功能可能是启动一个线程来控制小程序,向助手对象发送消息或以某种方式命令小程序开始运行。因为Applet是Panel的子类,所以经常会调用paint()方法来绘制图形,当applet所在的浏览器空间发生变化时,paint()也会被调用。 终止和启动是成对出现的。用户离开包含小程序的页面或小程序调用stop()方法时,该小程序将终止。默认情况下,即使在用户离开了页面后,小程序启动的线程仍将继续执行。通过覆盖stop()方法可以将线程挂起,并在用户返回小程序所在的页面时重新启动它们。 当卸载applet时,浏览器调用destroy()方法终止,使小程序释放其锁定的资源。通常用户自己不需覆盖destroy(),除非有特殊的资源需要释放,如小程序创建的线程。因为Java有一个自动的无用单元收集器,用于管理内存。当程序使用完资源后,收集器将收回这些资源使用的内存。 另外一个重要的方法是绘图方法paint(),它不是Applet类里定义的方法,而是继承自java.awt.Container类中的paint方法。绘图指的是小程序如何在屏幕上显示东西,这些可以是文本、几何图形或图像。每当小程序的窗口需要显示或重新显示时,该方法都将被调用。 与上述四个方法不同,paint()需要接受一个参数:Graphics类的实例。该对象被浏览器创建,并被传递给paint();该对象表示被绘制的区域,即小程序窗口。每当小程序窗口需要重新绘制时,包含小程序的环境(通常是Web浏览器)将自动调用paint()方法;要在小程序中请求重新绘制窗口,可以调用小程序的repaint()方法,无参数。 【例9.3】用输出相应字符串的方法,指示出Applet生命周期中init()、start()、stop()、destroy()方法的执行时间。 import java.awt.*; import java.applet.*; public class AppletLifeCycle extends Applet {String status = "";//成员变量 public void init()//创建时调用此方法 { status += "Call init() ->"; } public void start()//启动时调用此方法 { status+="Call start() ->"; } public void stop()//停止时调用此方法 { status+="Call stop() ->"; } public void destroy()//退出时调用此方法 { status+="Call destory() ->"; } public void paint(Graphics g)//被repaint()调用的方法 { g.drawString(status,20,40);//绘制字符串 } } Html文件设计如下: <html> <applet code = "AppletLifeCycle.class" width = "300" height = "45"> </applet> </html> 首次运行显示结果如图9.4(a),init()方法和start()方法被调用,当停止Applet后重新运行,可以发现stop()方法和destroy()方法被调用过。重新运行Applet时,显示结果如图9.4(b)所示。 注意:为了停止并重新运行Applet,可将窗口最小化后在再最大化,即要刷新窗口。可使用控制菜单,先选择“停止”,再选择“重新启动”。
9.4(a)运行Applet的界面
9.4(b)重新运行Applet的界面 9.3 Java Applet的参数存取 Java Applet从所在的HTML页面读取参数。 在包含小程序的HTML文件中,使用放置于<applet>和</applet>之间的<param>标记来指出每个参数。该标记有两个用于指定参数名称和值的属性:name和value。如: <applet code="Game.class" width=300 height=300> <param name="font"value="TimesRoman"> <param name="color"value="#FF0000"> <param name="size"value=12> This is a java applet game. </applet> 上述代码定义了小程序Game的三个参数:一个名为font,值为TimesRoman;另一个名为color,值为#FF0000(以#开始的十六进制字符串用来表示颜色,该值代表红色);最后一个名为size,值为24。 小程序被装载时,参数将被传递给小程序。在小程序的init()方法中,可以使用方法getParameter()来获得这些参数的值,所有的参数值都作为字符串被返回。如: String fontName = getParameter("font" ); String background = getParameter("color"); String fontSize = getParameter("size"); <param>中指定的参数与gerParameter()中的参数名必须相同(包括大小写)。如果参数没有在HTML文件中指定,则gerParameter()返回null。大多数情况下,需要检测null,并提供合理的默认值,如下: if ( fontName = = null ) fontName="TimesRoman"; 由于gerParameter()返回的是字符串,如果要求参数是其他对象或类型,必须自己进行转换。如要得到int型的size变量,可采用如下代码: int theSize; String fontSize = getParameter("size"); if (fontSize = =null ) theSize = 12; else the Size=Integer.parseInt(fontSize); 【例9.4】把HTML文件中设置的两组数据(“Yaoming”,30)和(“Shark”,40)传递给Applet,并在Applet界面中显示。 HTML文件设计如下: <html> <title>Applet Parameter Setting</title> <body> <applet code= AppletParameters.class name = AppletParameters width = 280 height = 100 alt = Browser does not support Java Applet > <param name ="Yaoming" value = "30"> <param name ="Shark" value = "40"> </applet> </body> </html> 在该HTML文件中,指定要运行的Applet为AppletParameter.class,图形界面的显示宽度为280像素,高度为100像素,如果不支持Applet,运行时显示“Browser does not support Java Applet”。用属性param设置了两个参数,一个参数的name为“Yaoming”,数值为30;另一个参数的name为“Shark”,数值为40。 与此相应地,Java Applet程序AppletParameter.java设计如下: import java.awt.*; import java.applet.*; public class AppletParameters extends Applet { String score1, score2; String message1, message2; int s1, s2; public void init()//启动浏览器时调用 { score1 = getParameter("Yaoming"); //取得Applet所嵌入的HTML文件的参数Yaoming的数值 score2 = getParameter("Shark"); //取得Applet所嵌入的HTML文件的参数Shark的数值 s1= Integer.parseInt(score1);//将字符串score1转换成整数 s2= Integer.parseInt(score2);//将字符串score2转换成整数 message1 = "Yaoming scores is:"+score1;//构造字符串message1 message2 = "Shark scores is:"+score2;//构造字符串message2 } public void paint(Graphics g) { g.drawString(message1,20,40);//在(20,40)位置绘制message1 g.drawString(message2,20,55); //在(20,55)位置绘制message2 g.fillRect(150,35,s1,10); //在(150,35)位置绘制宽为s1、高为10的实心矩形 g.fillRect(150,50,s2,10); //在(150,50)位置绘制宽为s2、高为10的实心矩形 } } 程序的运行结果如图9.5所示。
图9.5 数据传递的运行结果
|
|||
小结 Java Applet是嵌入到HTML主页中,由兼容Java语言的浏览器执行的小程序。与Java Application不同,Java Applet中不需要用main方法,它要求的是程序中有且必须有一个类是系统类Applet的子类,运行时由浏览器自动下载HTML中指定的Java Applet字节码,然后调用内置在浏览器中Java解释器来解释执行下载到本机的字节码程序。 Applet嵌入HTML页面中必须使用<Applet>标记,<Applet>标记是HTML标记的一种扩展,用于将小程序放置到Web页中,并控制其相对于Web页其他部分的显示效果。主要使用的标记包括code、width和height,分别用来指明Applet小程序的主类文件的位置、Applet小程序的宽度和高度。 在一个Applet的生命周期中,共有4种状态和4个方法:init()、start()、stop()和destroy()。初始化方法init()在小程序被装载时发生,该方法在Applet的生命周期中只执行一次。小程序初始化后,浏览器将调用start()方法启动程序。小程序被终止后,也可以将它重新启动。用户离开包含小程序的页面或小程序调用stop()方法时,该小程序将终止。当卸载applet时,浏览器调用destroy()方法终止,使小程序释放其锁定的资源。 Java Applet可以从所在的HTML页面读取参数,在包含小程序的HTML文件中,使用放置于<applet>和</applet>之间的<param>标记来指出每个参数,而在Java Applet程序中使用方法getParameter()来获得这些参数的值,所有的参数值都作为字符串被返回。 |