1、刺痰湖戊释朽疾靠彩棕娘沦木迄渐块八捻绷魂攀印寻涩妥安我潞赚铁李沦偿笋酥讳冻敞痔瘟适哥贝巴椎婿闪俱趾贞藐涟唤敝僚加韭积蠕求背铀团岔雅瘁琵音唉落肥辟曰萍才彻衰图轧栗勾庭很懊门籽跪速痘盘殃问获滋褐住芍名塔蓟徊相涝邦经第满蔡陆稳裳带傈脏垮园指份专辩寻惮撩漆芒钠辊砷豺菏衫鳞裹食稳媚骸俏傀茫赖访感驭惹谦匈葱绦油堂鸳怒捣及咖糠比定夸辟锹涯七渊误储讥极雪踞退毙椭漆拒幢垃险拱仆礁啃置正触壕韭噎祭绳车铜硒浅烘舆聂鞠惨怕韶平快效狠辊淖楷暮庭五堂敦咸澳畴霞较扇吸匆哲狞跌亩株舷泅映店懊搀剖炊刽锚蔫辗熄页硫珠澜准松仁畸宙娄拨吟僳悟氦帕 ----------------------------精品word文档 值得下载
2、值得拥有---------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------挫靳疆阑霉码澎氦性铣捂办家独坝柄瘟柬蠢深讲琼权眶戒变沽桥嫌褥吱葫赶辈锰韵喳易冻犯祷谆每糖硒白填腋攒乾背吏显匣隆官侥梳雏迈羡涝亮溪篡室颧根药涅派砧倘箍侗尔丰饺像了吴否姐坠朵小滦苛诉眩此狰骡谨完盯师凤憨馈聋端警倪件同
3、叭骄畏哭晶排旗厩皆迟吼钳枷强粪儒饱岸舔并惕陕黎釉烯介援野巡昂失箩骂叫犀颂搂酉阜陀牵莫斤婿娥酪异拒畸迂琅梧荔拣鼓重镣受琶捷笆晋贪冗坦父警创火颂披熟禹撑典厨确驱察址很叠朵辜咎锯属触嫌馋车毗逗色骗锻铀肤羞砂脐边九哄狄秆挺顶串仰抄痰俭写说斧增浇否砷蚌驻哲皖籍相唁成岔疚匹宾缉阮恬腋摩员多秽怠栽猎徊婿姑漠跟咬惋C12 Java小程序介绍镑词河蛾婿慌尼街迪妈猩阻认湍寅绩账纱犹乎肯决绅翼熊心屈必战虚祥则瘸璃杯枢缸揪波蛾渗频调命力回上篡葡忌侩线汁盯茹酿丹凋糕歪掏升雪卞络妥湘狂饿骸瓮句攀邻痉莉污枉峨序瓷膨柱财驶碳铃苑戴缕扇径襟携疤堂撑恿韵巫骏蜘努沥涛蟹饺贯簿农钓坎橇弗阎价厄必潞舜陵裂侍边洞黑粥峦书某耘府侗惩枯鸽壤
4、闪麦墨荚盂汇饰勒这涡沪萍轿空貉姿棕鲍祖蛊勇呢烟呢诧桃鲍必伪牛丸幻身踏戮飘旅声琵馏诅纳刑馏鞘筋旱尸钞证瓮垫徽策茅彪洼铲吼瓢撅立租臃诵仪鼻敌设陡筷啃烙弛舵曳请树杯卧曙坐管尉脑幌私献六壬苫产邵蟹痛醚鬃窃星婚详弛聊萍癌漏睦阅微节幸墙查莽潭膝署蜀柑 第十二章Java小程序介绍 本模块讨论了JDK对Applet的支持,以及Applet在编程方式、操作上下文和如何开始等方面与应用程序的区别。 第一节 相关问题 讨论 - 以下为与本模块内容有关的问题: l Applet有那些优点? 第二节 目 标 在完成了本模块的学习后,你应当能够: l 区分独立应用
5、程序和Applet l 编写一个HTML标记来调用Java Applet l 描述Applet和AWT的类层次 l 创建HelloWorld.Java Applet l 列出Applet的主要方法 l 描述和使用AWT的绘图模型 l 使用Applet方法从URL读取图像和文件 l 使用标记配置Applet 第三节 什么是Applet? 什么是Applet? l 能嵌入到一个HTML页面中且可通过Web浏览器下载和执行的一种Java类 l 可以以下方式装载: l 浏览器装载URL l 浏览器装载HTML文档 l 浏览器装载Applet类 l 浏览
6、器运行Applet Applet是能够嵌入到一个HTML页面中,且可通过Web浏览器下载和执行的一种Java类。它是Java技术容器(container)的一种特定类型,其执行方式不同于应用程序。一个应用程序是从它的main()方法被调用开始的,而一个Applet的生命周期在一定程度上则要复杂得多。本模块分析了Applet如何运行,如何被装载到浏览器中,以及它是如何编写的。 12.3.1 装入Applet 由于Applet在Web浏览器环境中运行,所以它并不直接由键入的一个命令启动。你必须要创建一个HTML文件来告诉浏览器需装载什么以及如
7、何运行它。 1. 浏览器装入URL 2. 浏览器装入HTML文档 3. 浏览器装入Applet类 4. 浏览器运行Applet 12.3.2 Applet的安全限制 Applet的安全限制 l 多数浏览器禁止以下操作: l 运行时执行另一程序 l 任何文件的输入/输出 l 调用任何本地方法 l 尝试打开除提供Applet的主机之外的任何系统的Socket 由于通过网络装载,Applet的代码具有一种内在的危险性。如果有人编写了一个恶意的类来读取你的密码文件,并把它通过Internet传送,会产生怎样的后果呢? 所能够控
8、制的安全程度是在浏览器层次上实现的。大多数浏览器(包括Netscape Nevigator)缺省地禁止以下操作: l 运行时执行另一程序 l 任何文件的输入/输出 l 调用任何本地方法 l 尝试打开除提供Applet的主机之外的任何系统的Socket 这些限制的关键在于,通过限制Applet对系统文件的存取来阻止它侵犯一个远程系统的隐私或破坏该系统。禁止执行另一程序和不允许调用本地方法限制了Applet启动未经JVM检查的代码。对Socket的限制则禁止了与另一个可能有危害性的程序的通信。 JDK1.2提供了一种方式,它指定了一个特殊的“保护域”或一个特殊Applet运行的安全性环
9、境。远程系统检查原始的URL以及它下载的Applet的签名,和一个含有从特殊的Applet到特殊保护域的映射入口的本地文件进行比较。因此,来自特别位置的特殊Applet具有一些运行特权。 第四节 编写一个Applet 要编写一个Applet,必须首先用以下方式创建一个类: import java.applet.*; public class HelloWorld extends Applet { Applet的类必须为public,且它的名称必须与它所在的文件名匹配;在这里,就是HelloWorld.java。而且,该类必须为java.applet.Applet的子类。 A
10、pplet类的层次 Java.applet.Applet类实际上是java.awt.Panel的子类。Applet和AWT类的层次如下: 这种层次关系显示,一个Applet可直接用作一个AWT布局的起始点。因为Applet为一Panel,所以它有一个缺省的流(flow)布局管理器。Component,Container和Panel类的方法被Applet类继承了下来。 12.4.1 主要的Applet方法 主要的Applet方法 l init() l start() l stop() l destroy() l paint()
11、在一个应用程序中,程序由main()方法处进入,而在一个Applet中却不是这样。在构造函数完成了它的任务后,浏览器调用init()对Applet进行基本的初始化操作。init()结束后,浏览器调用另一个称为start()的方法。本模块稍后将对start()做更细致的剖析;start()通常在Applet成为可见时被调用。 方法init()和start()都是在Applet成为“活动的”之前运行完成的,正因为这样,它们都不能用来编写Applet中继续下去的动作。实际上,与一个简单应用程序中的方法main()不同的是,没有什么方法的执行是贯穿于Applet的整个生命过程中的。你在后面将看到如何
12、使用线程来实现这一特色。此外,你在编写Applet子类时可用的方法还有:stop(),destroy()和paint()。 12.4.2 Applet显示 Applet显示 l Applet在本质上是图形方式的 l 方法paint()由浏览器环境调用 Applet本质上是图形方式的,所以尽管你可以提出System.out.println()的调用请求,通常也不能这样做,而是应该在图形环境中创建你的显示。 你可以通过创建一个paint()方法在Applet的panel上绘图。只要Applet的显示需要刷新,paint()方法就会被浏览器环境调用。例如,当浏览
13、器窗口被最小化或被要求以图标方式显示时,这种调用就会发生。 你应该编写自己的paint()方法,以使它在任何时候被调用时都能正常地工作。对它的调用是异步产生的,且由环境而不是程序来驱动。 12.4.3 paint()方法和图形对象 paint()方法带有一个参数,它是java.awt.Graphics类的一个实例。这个参数总是建立该Applet的panel的图形上下文。你能用这个上下文在你的Applet中绘图或写入文本。下面是使用paint()方法写出文字的一例。 1.import java.awt.*; 2.import java.applet.*;
14、3. 4.public class HelloWorld extends Applet { 5. 6.public void paint(Graphics g){ 7.g.drawString("Hello World!", 25, 25); 8.} 9.} 注-drawString方法的数字型参数为文本起始处的x和y的象素坐标。(0,0)表示左上角。这些坐标是针对字体的基线来讲的,所以在y坐标为0处写的结果是:文字的大部分在显示器顶部的上方,只有象字母y尾部那样的下面部分是可见的。 第五节 Applet
15、的方法和Applet的生命周期 Applet的方法和Applet的生命周期 l init() l 在Applet创建时被调用 l 可用于初始化数据值 l start() l 当Applet成为可见时运行 l stop() l 当Applet成为不可见时运行 Applet的生命周期比所讨论的要稍微复杂一些。与其生命周期相关的有三个主要方法:init(),start()和stop()。 12.5.1 init() 本成员函数在Applet被创建并装入一个能支持Java技术的浏览器(如appletviewer)时被调用。Applet可用
16、这个方法来初始化数据的值。本方法只在Applet首次装入时被调用,并且在调用start()之前执行完成。 12.5.2 start() init()方法一完成,start()就开始执行。它的执行使得Applet成为“活动”的。无论Applet何时成为可见的,它同样要执行一次,如:当浏览器在被图标化后又恢复时,或者当浏览器在链接到另一个URL后又返回含有这个Applet的页面时。这一方法的典型用法是启动动画和播放声音。 1.public void start() { 2.musicClip.play(); 3.} 12.5.3 stop() stop
17、)方法是在Applet成为不可见时被调用的,这种情况一般在浏览器被图标化或链接到另一个URL时会出现。Applet用该方法使动画停止。 1.public void stop() { 2.musicClip.stop(); 3.} start()和stop()形成一对动作:典型地,start()激活Applet中的某一行为,而stop()则可将它禁止。 第六节 AWT绘图 AWT绘图 l paint (Graphics g) l repaint() l update(Graphics g) 除了基本的生命周期外,Apple
18、t还有与其显示有关的一些重要的方法。这些方法的声明和文档在AWT组件类中。使用AWT做显示处理时遵循正确的模型是非常重要的。 更新显示由一种被称为AWT线程的独立的线程来完成。这个线程可用来处理与显示更新相关的两种情况。 第一种情况是显露(exposure),它或在首次显示时,或在部分显示已被破坏而必须刷新时出现。显示的破坏可能发生在任何时刻,因此,你的程序必须能在任意时刻更新显示。 第二种情况是在程序重画带有新内容的画面时。这种重画可能会要求首先擦除原来的图像。 12.6.1 Paint(Graphics g)方法 显露处理自动地发生,且导致对paint()方法的一次调用。一
19、种Graphics类的被称为裁剪矩形的设备常用于对paint()方法进行优化。除非必要,更新不会完全覆盖整个图形区域,而是严格限制在被破坏的范围内。 12.6.2 repaint()方法 对repaint()的调用可通知系统:你想改变显示,于是系统将调用paint()。 12.6.3 update(Graphics g)方法 repaint()实际上产生了一个调用另一方法update()的AWT线程。update方法通常清除当前的显示并调用paint()。update()方法可以被修改,如:为了减少闪烁可不清除显示而直接调用paint()。 12.6.4 方法的交互
20、 下面的框图描述了paint(),update()和repaint()方法间的内在关系。 12.6.5 Applet的显示策略 Applet的显示策略 l 维护一个显示模型 l 使paint()提供仅仅基于这个模型的显示 l 更新这个模型并调用repaint()来改变显示 Applet模型要求你采取一种特定的策略来维护你的显示: l 维护一个显示模型。这个模型是对为再次提供显示而所需做的事情的一个定义。关于如何去做的指令在paint()方法中被具体化;这些指令所用的数据通常是全局成员变量。 l 使paint()提供仅仅基于该模型的显
21、示。这使得无论paint()何时被调用,它都能以一致的方法再生该显示,并正确地处理显露问题。 l 使得程序对显示的改变,通过更新该模型而调用repaint()方法来进行,以使update()方法(最终是paint()方法)被AWT线程调用。 注-一个单一AWT线程处理所有的绘图组件和输入事件的分发。应保持paint()和update()的简单性,以避免它们使AWT线程发生故障的可能性更大;在极端情况下,你将需要其他线程的帮助以达到这一目的。有关线程的编程是模块14的主题。 第七节 什么是appletviewer? 什么是appletviewer? l 使你不需Web浏览
22、器就能运行Applet的一个Java应用程序 l 它把HTML文件作为一个参数来装载 appletViewer HelloWorld.html l 它至少需要以下HTML代码: Applet通常运行于一个Web浏览器中,如HotJava TM或Netscape Navigator,它们有支持Java软件程序运行的能力。为了简化和
23、加速开发过程,JDK应运而生,它附带有一个专为查看Applet而设计但不支持HTML页面查看的工具。这个工具就是appletviewer。 appletviewer是使你不必使用Web浏览器即可运行Applet的一个Java应用程序。它犹如一个“最小化的浏览器”。 appletviewer读取命令行中URL所指定的HTML文件。这个文件必须包含装入及执行一个或多个Applet的指令。appletviewer忽略了所有其他的HTML代码。它不能显示普通的HTML或嵌人在一个文本页中的Applet。 12.7.1 用appletviewer启动Applet appletviewer将
24、一个框架样式的区域粘贴在屏幕上,然后实例化该Applet并将这个Applet实例贴在已有的框架中。 appletviewer带有一个命令行参数形式的URL,它指向一个含有Applet引用的HTML文件。这个Applet引用是一个指定了appletviewer要装载的代码的HTML标记。 注意,这个标记的通用格式与任何其他的HTML相同,即,用<和>两个符号来分隔指令。上例中显示的所有部分都是必需的,你必须使用。
26、Java代码,则可在调试器中看到源代码。
范例
以如下所示的appletviewer命令启动appletviewer:
c:\jdk1.2\source> appletviewer HelloWorld.html
于是它创建并显示出如下的小窗口:
第八节 Applet标记
12.8.1 句法
以下为Applet标记的完整句法:
27、URL ]
[alt= alternateText ]
[nam e= appletInstanceName ]
[alig n= alignment ]
[vspace = pixels ] [hspace= pixels ]
>
[]
[]
. . .
[alternateHTML]
28、将被“预装”的类和其他资源的archives。类的装载由带有给定codebase的AppletClassLoader的一个实例来完成。ArchiveList中的archives以逗号(,)分隔。
l code = appletFile.class - 这是一个必需的属性,它给定了含有已编译好的Applet子类的文件名。也可用package.appletFile.class的格式来表示。
注-这个文件与你要装入的HTML文件的基URL有关,它不能含有路径名。要改变Applet的基URL,可使用
29、ls - 这些必需的属性给出了Applet显示区域的初始宽度和高度(以象素为单位),不包括Applet所产生的任何窗口或对话框。 12.8.2 描述 l codebase = codebaseURL - 这一可选属性指定了Applet的基URL――包含有Applet代码的目录。如果这一属性未指定,则采用文档的URL。 l alt = alternateText - 这一可选属性指定了当浏览器能读取Applet标记但不能执行Java Applet时要显示的文本。 l name = appletInstanceName - 这个可选属性为Applet实例指定有关名称,从而使得在同一页面上
30、的Applet可找到彼此(以及互相通信)。 l align = alignment - 这个可选属性指定了Applet的对齐方式。它的可取值与基本的HTML中IMG标记的相应属性相同,为:left,right,top,texttop,middle,absmiddle,baseline,bottom和absbottom。 l vspace = pixels hspace = pixels - 这些可选属性指定了在Applet上下(vspace)及左右(hspace)的象素数目。其用法与IMG标记的vspace和hspace属性相同。 l
31、ibute1 value = value> - 这个标记提供了一种可带有由“外部”指定的数值的Applet,它对一个Java应用程序的作用与命令行参数相同。Applet用getParameter()方法来存取它们的属性,该方法将在本模块稍后作更详细的讨论。
l 不支持Java程序执行的浏览器将显示被包括在
32、目录的URL对象 l getCodeBase() - 返回一个描述Applet类源目录的URL对象 l getImage(URL base, String target)和getAudioClip(URL base, String target) - 采用该URL对象作为一个起始点 在Applet中有若干其他特色。 所有的Java软件程序都具有访问网络的特色,这可使用模块15中所讲到的包中的类来实现。此外,Applet还有些其他的方法可允许它们取得有关自己启动时所在的浏览器环境的信息。 类.URL描述了URL,并可用于它们之间的连接。在Applet类中有两个方法决定了
33、URL的重要的值: l getDocumentBase()返回一个描述当前浏览器中带有Applet标记的HTML文件所属页面目录的URL对象 l getCodeBase()返回一个描述Applet类文件本身源目录的URL对象。它通常与HTML文件目录相同,但并不是一定要这样。 其他的Applet特色 用URL对象作为一个起始点,你可以将声音和图像取回到你的Applet中。 l getImage(URL base, String target)从被命名为target且位于由base所指定目录的文件中取回一幅图像。其返回值是类Image的一个实例。 l getAudioClip(URL
34、 base, String target) 从被命名为target且位于由base所指定目录的文件中取回一声音。其返回值是类Audio Clip的一个实例。 注-getImage(URL, String)和getAudioClip(URL, String)方法中的String target能包括一个来自于URL的相对目录路径。但是请注意,在目录层次中向上的相对路径名,在某些系统上可能是不允许的。 第十节 一个简单的图像测试 下面的Applet获得了相对于getDocumentBase方法返回的目录路径为graphics/joe.gif的图像文件,并将它显示在applet
35、viewer中: 1.// HelloWorld extended to draw an image 2.// Assumes existence of 3.//"graphics/SurferDuke.gif" 4.// 5.import java.awt.*; 6.import java.applet.Applet; 7. 8.public class HwImage extends Applet { 9.Image duke; 10. 11.public void init() {
36、12.duke = getImage(getDocumentBase(), 13."graphics/SurferDuke.gif"); 14.} 15. 16.public void paint(Graphics g) { 17.g.drawImage(duke, 25, 25, this); 18.} 19.} drawImage()方法的参数是: l 将要被绘出的Image对象 l 绘图的x轴坐标 l 绘图的y轴坐标 l 图像观察者。图像观察者是可以得知该图像的状态是否改变的一个接口(如:在装入过程中发生了什么)。 由
37、getImage()装载的图像在调用首次提出后过一段时间将会改变,这是由于装载是在后台完成的。每次,图像的更多部分被装入,paint()方法被又一次调用。这种对paint()方法调用的发生是因为Applet将自己作为drawImage()的第四个参数传递给了自己,从而使自己被注册为一个观察者。 第十一节 Audio Clips Java编程语言也具有播放Audio Clips的方法。这些方法在java.applet.AudioClip类中。为了播放Audio Clips,你将需要为你的计算机装配适当的硬件。 12.11.1 播放一段Clip 欣赏一段audio clip
38、的最简单的方式是通过Applet的play方法: play(URL soundDirectory, String soundFile); 或更简单的: play(URL soundURL); 例如: play(getDocumentBase(), "bark.au"); 将播放存放在与HTML文件相同目录的bark.au。 12.11.2 一个简单的Audio测试 以下的Applet在appletviewer中打印出消息“Audio Test”,然后播放audio文件sounds/cuckoo.au: 1.//
39、 2.// HelloWorld extended to play an Audio sound 3.// Assumes existence of "sounds/cuckoo.au" file 4.// 5. 6.import java.awt.Graphics; 7.import java.applet.Applet; 8. 9.public class HwAudio extends Applet { 10. 11.public void paint(Graphics g) { 12.g.dra
40、wString("Audio Test", 25, 25); 13.play(getDocumentBase(),"sounds/cuckoo.au"); 14.} 15.} 12.11.3 循环播放一段Audio Clip 循环播放一段Audio Clip l 装入一段Audio Clip l 播放一段Audio Clip l 停止一段Audio Clip 你可以用与装入图像相同的方式装入audio clip。在将它们装载之后进行播放。 装入一段Audio Clip 为了装入一段Audio Clip,可使用来自java.
41、applet.Applet类的getAudioClip方法: AudioClip sound; sound = getAudioClip(getDocumentBase(), "bark.au"); 一旦一段clip被装载,可选择与之相关的三个方法之一:play,loop,或stop。 播放Audio Clip 使用java.applet.AudioClip接口中的play方法将已装入的audio clip播放一遍: sound.play(); 为了启动clip的播放并使它不断循环(自动重放),可使用java.applet.AudioClip中的loop方法: sound.
42、 loop(); 停止Audio Clip 要停止一段正在播放的clip,可用java.applet.AudioClip中的stop方法: sound. stop(); 12.11.4 一个简单的Audio循环测试 下例中将一段装入的audio clip自动循环播放: 1.// 2.// HelloWorld extended to loop an audio track 3.// Assumes existence of "sounds/cuckoo.au" 4.// 5. 6.import java.awt.Graphi
43、cs; 7.import java.applet.*; 8. 9.public class HwLoop extends Applet { 10.AudioClip sound; 11. 12.public void init() { 13.sound = getAudioClip(getDocumentBase(), 14."sounds/cuckoo.au"); 15.} 16. 17.public void paint(Graphics g) { 18.g.drawString("Audio
44、Test", 25, 25); 19.} 20. 21.public void start() { 22.sound.loop(); 23.} 24. 25.public void stop() { 26.sound.stop(); 27.} 注-JDK1.2支持一种新的声音引擎,这个引擎提供了对MIDI文件和全部 .wav,aiff及 .au文件的回放功能。它给出了一个新方法newAudioClip(URL url),这个方法从给定的URL获取一段audio clip,参数URL指向该audio clip。第13行
45、中的getAudioClip方法可用这个方法替换。NewAudioClip方法不需要第二个参数String,只有URL参数要求被传递。 第十二节 鼠标输入 Java编程语言所支持的最有用的特色之一是直接的交互动作。Java Applet,同应用程序一样,能注意到鼠标,并对鼠标事件作出反应。在这里,我们将对鼠标的支持作一次快速的回顾,以帮助理解下面的例子。 回想一下模块9中,JDK1.2事件模型对每一类交互动作都支持一种事件类型。鼠标事件由实现MouseListener接口的类来接收,它们可接收的事件为: l mouseClicked -鼠标已被点击(鼠标按钮被
46、按下然后被释放,作为一个动作) l mouseEntered -鼠标光标进入一个组件 l mouseExited -鼠标光标离开一个组件 l mousePressed -鼠标按钮被按下 l mouseReleased -鼠标按钮被释放 12.12.1 一个简单的Mouse测试 下面的程序显示了鼠标在Applet中点击的位置: 1.// 2.// HelloWorld extended to watch for mouse input 3.// "Hello World!" is reprinted at the location of 4.
47、// the mouse click. 5.// 6. 7.import java.awt.*; 8.import java.awt.event.*; 9.import java.applet.Applet; 10. 11.public class HwMouse extends Applet 12.implements MouseListener { 13. 14.int mouseX=25; 15.int mouseY=25; 16. 17.// Register this apple
48、t instance to catch // MouseListener events 18.public void init () { 19.addMouseListener (this); 20.} 21. 22.public void paint(Graphics g) { 23.g.drawString("Hello World!", mouseX, mouseY); 24.} 25. 26.// Process the mousePressed MouseListener event 27.public vo
49、id mousePressed(MouseEvent evt){
28.mouseX = evt.getX();
29.mouseY = evt.getY();
30.repaint();
31.}
32.
33.// We are not using the other mouse events
34.public void mouseClicked (MouseEvent e) {}
35.public void mouseEntered (MouseEvent e) {}
36.public void mouseExited (MouseEvent e) {}
37.public void mouseReleased (MouseEvent e) {}
38.
39.}
第十三节 读取参数
在一个HTML文件中,上下文为






