Java就业培训教程第十章.docx
- 文档编号:10531709
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:30
- 大小:178.55KB
Java就业培训教程第十章.docx
《Java就业培训教程第十章.docx》由会员分享,可在线阅读,更多相关《Java就业培训教程第十章.docx(30页珍藏版)》请在冰点文库上搜索。
Java就业培训教程第十章
第10章Applet
10.1浏览器怎样显示网页
在学习Applet之前,我们先来看看浏览器是如何显示网页的。
浏览器打开网页文件的过程同我们用记事本程序打开文本文件的过程是一样的,只是浏览器会对这个网页文件中的内容用特殊的方式显示。
浏览器除了从本地硬盘上打开网页文件外,还可以从网络上的WWW服务器上打开网页文件。
网页文件就是一个普通的文本文件,这个文本文件里的一些特殊字符序列被当作一种html标记,浏览器打开网页文件时,不是象记事本程序那样简单地显示文本文件里的内容,而是对这些标记作特殊处理。
我们先用一个实验来看看这种效果,用记事本程序创建一个test.txt文本文件,文件内容如下:
编写完上述代码后,我们将它存盘并将文件名改为test.htm。
然后用IE浏览器打开这个文件,我们可以看到在浏览器中显示的字体大小为30象素,颜色为红色,内容为“www.it315.org”的文字串在不停地水平滚动,但放在尖括号(<>)中的字符序列,如
我们点击IE浏览器上的“查看”“源文件”菜单,又能够看到test.htm中的原始文本内容。
所以说浏览器的基本功能就是根据html标签的含意,用特殊的效果去显示标签对中所引用的文本内容。
10.2浏览器处理网页脚本代码的过程
现在我们再在刚才用“查看”“源文件”菜单打开的test.htm原始文本文件中增加下面的内容:
--
optionexplicit
privatestrStatus
privateintSpace
privateintDir
subwindow_onload()
strStatus="www.it315.org"
intSpace=0
intDir=1
window.SetTimeout"Scroll",100
endsub
subScroll()
dimstrTemp
intSpace=intSpace+1*intDir
ifintSpace>40orintSpace<=0then
intDir=-1*intDir
endif
strTemp=string(intSpace,"")
window.status=strTemp&strStatus
window.SetTimeout"Scroll",100
endsub
-->
编辑结束后,我们存盘并刷新IE浏览器,重新显示test.htm。
这时我们能够看到在浏览器的状态栏上,“www.it315.org”这几个文字在来回跑动。
当IE浏览器碰到上面这段文本时,发现这是一段vbscript程序代码,便解释执行这段程序代码。
注意,浏览器要解释执行这段程序代码,就必需内嵌有vbscript解释器,如果有些浏览器不具有vbscript解释器,就不能正确处理上面这段文本。
10.3浏览器怎么处理Applet
了解了上面这些内容,我们就比较容易理解什么是Applet了。
简单的说,Applet就是在www浏览器中执行的Java程序。
首先,编写如下的一个Java程序。
importjava.applet.*;
importjava.awt.*;
publicclassMyAppletextendsApplet
{
publicvoidinit()
{
}
publicvoidpaint(Graphicsg)
{
g.drawString(“thisisasimpleapplet”,50,60);
}
}
编译这个程序,并将生成的MyApplet.class文件与test.htm放在同一目录(这里我们放在c盘的test目录下)。
修改test.htm的源文件,在最后处增加下面一行文本。
当浏览器碰到这行文本时,就知道要在网页的相同目录中装载一个名为MyApplet的Java类,这里的MyApplet在浏览器中占据300*300的显示和运行空间,如图10.1所示。
图10.1
在上面这种情况下应用的Java程序就是Applet,与通常的Java程序不同,一个Applet小应用程序的执行不是从main()开始的,Applet小应用程序用一种与普通应用程序完全不同的机制来启动和执行,我们在后面的部分将对这种机制进行详细介绍。
Applet小应用程序是一个GUI程序,在Applet小应用程序窗口中打印字符文本,并不是由函数System.out.println()完成的,而是由各种不同的AWT方法来实现,例如drawString(),这个方法可以向窗口的某个由X,Y坐标决定的特定位置输出一个字符串。
同样的,Applet小应用程序接收数据输入也是按GUI方式进行的。
同网页中的script一样的道理,浏览器要正确显示并运行MyApplet,必需内嵌Java解释器。
Applet的引用语句嵌入到HTML页面中,Applet在浏览器解释这段代码时被下载到客户端。
Applet是一个Java类,不同于其他的Java类。
Applet是按下面的过程执行的。
●浏览器载入要访问的HTML文件的URL地址。
●浏览器载入HTML文件
●浏览器载入Applet的类字节代码
●启动Java虚拟机执行Applet。
一向喜欢玩弄垄断手法的微软曾经就去掉了IE浏览器中内嵌Java解释器,导致使用IE浏览器的用户没法正常显示带有Applet的网页,这样就会导致没人再使用Applet,以此报复老对手Sun公司,最后又引发了一场的官司,最终以Sun获胜,Microsoft又不得不在最新的IE浏览器中重新内嵌Java解释器,以支持Applet。
如果读者使用某些版本的IE浏览器,可能会碰到Applet显示不了的情况,这是因为这个版本的IE浏览器中没有内嵌Java解释器的缘故。
我们在安装JDK1.4的时候,会出现如图10.2所示的安装界面,意思是选择JavaPlug-in软件来支持浏览器,就用来解决这种在浏览器中解释执行Applet的问题的。
图10.2
有的时候我们正确的安装了JDK,并且也选择了JavaPlug-in软件,但是在IE浏览器中仍然不能正常显示Applet小程序。
就让我们运行先前编写的test.htm来显示这种错误吧,如图10.3所示。
图10.3
要解决这种问题其实很简单,我们只需要在IE浏览器的“工具”“Intetnet选项”“高级”中选中“使用Java2用于Applet”就可以了,如图10.4所示。
图10.4
讲到这里大家应该对Applet有了一个基本的认识,接下来我们再来详细介绍Applet的类及其方法。
10.4Applet类及其方法
MyApplet不是一个任意的Java类,必须是java.applet.Applet的子类。
MyApplet类就是一个Applet,是具有图形用户界面的小程序,俗称Java小程序。
WWW浏览器中内嵌Java解释器是按照下面的过程来使用Applet的。
首先,WWW浏览器装载网页并解释其中的内容,碰到Applet标签后,下载标签中指定的Applet类字节码并创建该类的实例对象。
经过了WWW浏览器中内嵌Java解释器的处理,我们的浏览器就能够正常运行Applet小程序了。
几乎大多数的Applet小应用程序都重载一套方法,这些方法提供了浏览器或Applet小应用程序阅读器与Applet小应用程序之间的接口以及前者对后者的执行进行控制的基本机制。
这套方法中的四个,init(),start(),stop()和destroy()都是由Applet所定义的。
另一个方法,paint()是由AWT组件类定义的。
Applet小应用程序可以不重载那些它不想使用的方法,但是,只有非常简单的Applet小应用程序才不需要定义全部的方法。
这五个方法组成了程序的基本主框架。
1.init()方法
Applet对象创建后,Java会立即调用该对象的init()方法,以通知Applet对象进行初始化,尽管Applet小程序也可以象通常的类一样用构造方法进行初始化,但它习惯于在init方法中执行所有的初始化。
这个方法在Applet对象的生存期间只会被调用一次。
我们可以按照如下格式书写方法init():
publicvoidinit()
{
//Codehere
}
2.start()方法
Java在调用了init方法后,会接着调用这个方法。
在WWW浏览器每次离开创建此Applet对象的页面后,Java所创建的Applet对象不会消失,当WWW浏览器再回到创建此Applet对象的页面时,又会调用这个方法。
有些程序的功能在只有网页当前被显示时才要保持运行,而浏览器离开此网页时应停止运行,以节省浏览器的资源开销。
start方法中比较适合于放置这种功能的启动代码,通常都与下面的stop方法配合使用。
如网页正常显示时打开一个数据库连接或是启动一个音乐播放线程,在浏览器离开该网页时应关闭数据库连接或是停止音乐播放线程。
我们可以按照如下的方法书写方法start():
publicvoidstart()
{
//Codehere
}
3.stop()方法
终止和启动是成对出现的。
在WWW浏览器每次离开创建此Applet对象的页面后,去访问另一个页面时,java会调用Applet的stop方法。
当stop()被调用时,小应用程序还在运行,你应该使用stop()来停止只有网页当前被显示时才要保持运行的功能。
这样在stop方法中就可以停止先前由start方法启动的功能,此时当用户回到此页面时,start方法又会被调用,你就可以重新启动先前已停止的功能。
下面的例子显示了方法stop()的格式:
publicvoidstop()
{
//Codehere
}
4.destroy()方法
当维护该Applet对象的WWW浏览器关闭时,Applet对象也将被销毁。
在Applet对象被销毁之前,destroy方法会被调用,该方法中通常用于释放init方法中初始化的资源,调用该方法之前,肯定已经调用了stop方法,我们可以按如下的格式来书写方法destroy():
publicvoiddestroy()
{
//Codehere
}
指点迷津:
你也许想知道destroy()与我们在第三章“finalize方法”中介绍的finalize()究竟有什么不同它们的区别在于,方法destroy()只适合于Applet(小应用程序);finalize()是一个更加通用的方法,它可用于任何类型的单个对象。
此外,Java有一个自动的垃圾收集器来为你管理内存,这也是我们前面讲过的内容。
当程序使用完资源之后,这个收集器会从这些资源中回收内存,但由于finalize()方法的不可靠,因此你通常需要使用destroy()方法,而不是用finalize()方法来释放资源。
5.paint()方法
我们先看看Applet类的继承层次关系
java.lang.Object|+----java.awt.Component|+----java.awt.Container|+----java.awt.Panel|+----java.applet.Applet
从上面的继承层次关系中,我们可以看到Applet是Panel的子类,因此具有Panel的所有功能,我们能够在上面添加AWT组件,显示图像,绘制图形,注册事件监听器。
正因为Applet具有这种特性,我们在网页中使用Applet,就能让网页具有GUI程序的功能,这正是我们要使用Applet的原因。
如在网页上显示一辆汽车,用户可以用鼠标拖动汽车旋转,从各个角度去欣赏这款汽车,也可以打开汽车的车门,查看汽车里面的结构。
就如我们在GUI章节中所讲的一样,在每一次你的小应用程序被重画后,paint()方法都被调用。
这种情形的产生有几个原因。
例如,小应用程序正在运行的窗口可能被另一个窗口覆盖,之后再恢复。
或小应用程序窗口可能被缩小再复原。
paint()方法也在小应用程序开始执行时被调用。
不管是什么原因,只要小应用程序必须重画窗口,paint()就被调用。
paint()方法有一个Graphics类型的参数。
这个参数包含了图像上下文,描述了小应用程序所运行的环境。
在需要对小应用程序进行输出时,这个上下文都被用到。
方法paint()看上去有如下格式:
publicvoidpaint(Graphicsg)
{
//Codehere
}
10.5一个显示动画的Applet的程序
了解了上面这些关于Applet的知识,我们接着修改上面的MyApplet类的源程序。
新的MyApplet的主要功能是定时轮循显示十幅图像以产生动画效果,为了实现这个效果,我们首先必须要让程序具有定时功能。
在这个程序中,我们是在一个新的线程中调用Thread.sleep方法来模拟定时器功能的,下面是MyApplet的源程序。
importjava.applet.*;
importjava.awt.*;
import.*;
publicclassMyAppletextendsAppletimplementsRunnable
{
Image[]imgs=newImage[10];
intindex=0;
publicvoidinit()
{
try{
for(inti=0;i<10;i++)
{
imgs[i]=getImage(newURL(getCodeBase(),"img\\T"+
(i+1)+".gif"));
/*imgs[i]=getToolkit().getImage(newURL(getCodeBase(),
"img\\T"+(i+1)+".gif"));*/
}
newThread(this).start();
}
catch(Exceptione){e.printStackTrace();}
}
publicvoidpaint(Graphicsg)
{
g.drawImage(imgs[index],0,0,this);
/*下面设置的字体必须是你的计算机中存在的字符,打开记事本程序的字体设置对话框,从其中可选的字体中复制一个到这里就行了。
*/
g.setFont(newFont(“隶书”,Font.ITALIC|Font.BOLD,30));
index=(index+1)%10;
g.drawString(""+index,0,50);
}
publicvoidrun()
{
while(true)
{
repaint();
try
{
Thread.sleep(100);
}catch(Exceptione){}
}
}
}
在上面的程序中,我们先用一个数组存储了要显示的十幅图像,接着启动了一个新的线程,新线程每隔100毫秒就会调用Component.repaint方法通知Applet重画,从而导致paint方法被调用,每一次paint调用都将显示变量index的值所对应的图像,程序中用index=(index+1)%10;这行代码让index变量的取值在0-9之间循环变化,也就实现程序所装载的十幅图像循环显示。
当一个程序功能稍微有些复杂时,我们很难一气呵成,即使这样做了,万一程序不能按预期的结果运行,我们就不太好定位问题所在了。
因此,作者在编写这个例子时,是分两个阶段来完成的,第一个阶段实现定时功能,运行后查看index的值是否每隔100毫秒在0—9之间循环变化显示,所有与图像有关的代码都没有编写。
只有确认第一阶段的程序功能正常后,我们才进入第二个阶段,才开始编写与图像有关的代码,实现图像显示。
在第一个阶段,我们在paint方法中使用
g.drawString(""+index,0,50);
这句程序代码,在Applet中打印出index的值以检查定时器功能是否正常。
将整数转化成字符串除了用String.valueOf(整数)方法外,""+整数(即用空字符串与整数相连),也是常用的一种方式。
只有通过了第一阶段,我们才开始加入第二阶段的程序代码。
Applet类自身就提供有一个getImage方法可以获得图像对象,我们在AWT中也使用过Component.getToolkit().getImage方法获得过图像对象,上面的程序中用注释给出了第二种方法在这里的应用,以供读者参考。
要注意的是,网页与Applet类通常都是放在WWW服务器上的,Applet所用到的资源(这里是图像文件)也应一并放在WWW服务器上,所以在这里的getImage方法中,我们不能用本地路径来指定图像文件的位置,如c:
\img\T1.gif等,我们需用表示Internet网络资源路径的方式来指定图像文件的位置,也就是URL。
在讲解分析我们的程序代码之前,我们必须先对URL进行详细的讲解。
10.5.1URL类
URL(统一资源定位符,UniformResourseLocator的英文简写)用于表示Internet网络上资源的地址。
URL一般由协议名、资源所在的主机名和资源本身的名称等三个部分组成,例如下面的URL:
http:
//www.it315.org/home/welcome.html
所用的协议是http(HypertextTransferProtocol,超文本传输协议)协议,资源所在的主机名为www.it315.org,资源名为/home/welcome.html。
URL还可以包含端口号来指定要连接的远端主机的端口,如果不指定端口号,则使用协议的默认端口号。
例如,http协议的默认端口号是80,在上面这些URL例子中,使用的端口号就是80。
如果http服务器所用的端口号不是80,而是8080,在URL中要显式指定http服务器的端口号,指定端口号的URL形式如下:
http:
//www.it315.org:
8080/index.html
URL通常是大小写敏感的(除机器名外),有些应用软件在开发时并没有太注意这个问题,有的可能是对整个URL都区分大小写,有的可能是URL的一部分区分大小写,有的对整个URL都不区分大小写。
然而,要识别这些应用软件间的差异,并不容易,用户需要自己经常多留意这个问题,并做到心中有数。
在许多应用中,我们也可以使用相对URL。
一个相对的URL不包括协议或主机地址信息,表示它的路径与当前文档(或其他的Internet资源)的访问协议、主机名相同,甚至有相同的目录路径。
相对URL的使用,与我们本地计算机上的文件系统的相对目录的使用相似,用“/”开头,表示主机上的某种协议的根目录,用“../”开头表示当前资源所在目录的父目录,“../../”表示父目录的父目录。
而直接使用目录名或文件名,表示当前目录下的子目录或文件,与用“./”开头的效果是一样的。
Java在包中专门为URL定义了对应的URL类。
查看JDK文档帮助,其有多种形式的构造函数,我们的网页、Applet以及这些图像文件可以放在不同网络地址的WWW服务器上的不同目录下,我们是没法确定这些图像文件的绝对路径的。
但网页、Applet以及这些图像文件的相对路径关系是必须固定的,而Applet类又提供了getCodeBase方法返回Applet的URL,getDocumentBase方法返回网页的URL,我们便很容易想到用相对URL的方式来构造这些图像文件资源的URL。
按照这个想法,我们可以使用
publicURL(URLcontext,Stringspec)throwsMalformedURLException
这个构造函数来创建这些图像文件的URL对象。
对于getCodeBase和getDocumentBase方法,我们倒底用哪一个好呢?
Applet与网页的路径关系是可能变化的,也就是不一定在同一目录,这取决于网页中
图像文件与Applet类联系紧密,是作为一个整体提供的,所以,我们应该选用getCodeBase方法。
关于
读者可以试试将程序中的
imgs[i]=getImage(newURL(getCodeBase(),"img\\T"+(i+1)+".gif"));这行代码改为
imgs[i]=getImage(newURL(getCodeBase(),"img\\T"+i+1+".gif"));看看运行结果有什么差别。
为了看到MyApplet的运行效果,在上面的例子中,我们的网页文件与MyApplet.class必须在同一文件目录下,该目录下还必需有个img的子目录,img目录中保存有T1.gif,T2.gif………T10.gif等十副图像文件,作者用的是JDK中的例子程序所带的十副图像文件,它们位于:
用WWW浏览器打开网页文件,就可以看到MyApplet的运行效果了。
10.5.2update方法
读者可以回顾一下我们在AWT中讲过的部件重绘时的函数调用关系,如图10.5所示。
图10.5
程序调用repaint()方法导致的部件重绘过程中,AWT线程调用Component.update方法,Component.update再调用paint方法。
我们正好可以借用这个程序来研究一下repaint()方法的调用过程,来了解Update方法。
在MyApplet类中覆盖基类Component的update方法。
MyApplet类中的update方法的程序代码如下:
publicvoidupdate(Graphicsg)
{
}
这样,MyApplet将又有怎样的运行效果呢?
由于MyApplet覆盖了Component.update方法,按照对象的多态性,AWT线程将调用MyApplet中的update方法,程序中的update方法什么代码也没写,不会再去调用paint方法了,所以没有动画显示的效果了。
但窗口曝光时仍会调用paint方法,所以第一幅图像和index的值还是应该被显示出来的。
重新编译MyApplet类,在WWW浏览器中刷新刚才打开的MyApplet网页,和先前运行的效果没有什么两样,MyApplet仍然具有动画功能。
这是因为在WWW浏览器中调用的还是程序修改前装载的那个MyApplet类,在前面讲过,浏览器关闭之前,java所创建的Applet对象不会消失,当WWW浏览器再回到创建此Applet对象的页面时,不会再创建新的Applet对
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 就业 培训 教程 第十