Java applet(小程序)介绍
本节讨论了JDK对Applet的支持,以及Applet在编程方式、操作上下文和
如何开始等方面与应用程序的区别。
7.1·什么是Applet?
Applet是能够嵌入到一个HTML页面中,且可通过Web浏览器下载和执行的
一种Java类。它是Java技术容器(container)的一种特定类型,其执行
方式不同于应用程序。一个应用程序是从它的main()方法被调用开始的,
而一个Applet的生命周期在一定程度上则要复杂得多。本模块分析了
Applet如何运行,如何被装载到浏览器中,以及它是如何编写的。
7.1.1·装入Applet
由于Applet在Web浏览器环境中运行,所以它并不直接由键入的一个命令启动。
你必须要创建一个HTML文件来告诉浏览器需装载什么以及如何运行它。
1. 浏览器装入URL
2. 浏览器装入HTML文档
3. 浏览器装入Applet类
4. 浏览器运行Applet
7.1.2·Applet的安全限制
由于通过网络装载,Applet的代码具有一种内在的危险性。如果有人编写了
一个恶意的类来读取你的密码文件,并把它通过Internet传送,会产生怎样
的后果呢?所能够控制的安全程度是在浏览器层次上实现的。大多数浏览器
(包括Netscape Nevigator)缺省地禁止以下操作:
-- 运行时执行另一程序
-
- 任何文件的输入/输出
-- 调用任何本地方法
-- 尝试打开除提供Applet的主机之外的任何系统的Socket
这些限制的关键在于,通过限制Applet对系统文件的存取来阻止它侵犯一个
远程系统的隐私或破坏该系统。禁止执行另一程序和不允许调用本地方法
限制了Applet启动未经JVM检查的代码。对Socket的限制则禁止了与另一个
可能有危害性的程序的通信。JDK1.2提供了一种方式,它指定了一个特殊的
"保护域"或一个特殊Applet运行的安全性环境。远程系统检查原始的URL以
及它下载的Applet的签名,和一个含有从特殊的Applet到特殊保护域的映射
入口的本地文件进行比较。因此,来自特别位置的特殊Applet具有一些
运行特权。
7.2·编写一个Applet
要编写一个Applet,必须首先用以下方式创建一个类:
import java.applet.*;
public class HelloWorld extends Applet {
Applet的类必须为public,且它的名称必须与它所在的文件名匹配;在这里,
就是HelloWorld.java。而且,该类必须为java.applet.Applet的子类。
Applet类的层次
Java.applet.Applet类实际上是java.awt.Panel的子类。Applet和AWT类的
层次如下:
这种层次关系显示,一个Applet可直接用作一个AWT布局的起始点。因为
Applet为一Panel,所以它有一个缺省的流(flow)布局管理器。
Component,Container和Panel类的方法被Applet类继承了下来。
7.2.1·主要的Applet方法
在一个应用程序中,程序由ma
in()方法处进入,而在一个Applet中却不是
这样。在构造函数完成了它的任务后,浏览器调用init()对Applet进行
基本的初始化操作。init()结束后,浏览器调用另一个称为start()的方法。
本模块稍后将对start()做更细致的剖析;start()通常在Applet成为可见
时被调用。方法init()和start()都是在Applet成为"活动的"之前运行
完成的,正因为这样,它们都不能用来编写Applet中继续下去的动作。
实际上,与一个简单应用程序中的方法main()不同的是,没有什么方法的
执行是贯穿于Applet的整个生命过程中的。你在后面将看到如何使用线程
来实现这一特。此外,你在编写Applet子类时可用的方法还有:stop(),
destroy()和paint()。
7.2.2·Applet显示
Applet本质上是图形方式的,所以尽管你可以提出System.out.println()
的调用请求,通常也不能这样做,而是应该在图形环境中创建你的显示。
你可以通过创建一个paint()方法在Applet的panel上绘图。只要Applet
的显示需要刷新,paint()方法就会被浏览器环境调用。例如,当浏览器
窗口被最小化或被要求以图标方式显示时,这种调用就会发生。你应该编
写自己的paint()方法,以使它在任何时候被调用时都能正常地工作。
对它的调用是异步产生的,且由环境而不是程序来驱动。
7.2.3·paint()方法和图形对象
paint()方法带有一个参数,它是java.awt.Graphics类的一个实例。这个
参数总是建立该Applet的panel的图形上下文。你能用这个上下文在你的
Applet中绘图或写入文本。下面是使用paint()方法写出文字的一例。
1.import java.awt.*;
2.import java.applet.*;
3.
4.public class HelloWorld extends Applet {
5.
6.public void paint(Graphics g){
8.}
9.}
注-drawString方法的数字型参数为文本起始处的x和y的象素坐标。
(0,0)表示左上角。这些坐标是针对字体的基线来讲的,所以在y坐标
为0处写的结果是:文字的大部分在显示器顶部的上方,只有象字母y尾部
那样的下面部分是可见的。
7.3·Applet的方法和Applet的生命周期
Applet的生命周期比所讨论的要稍微复杂一些。与其生命周期相关的有三个
主要方法:init(),start()和stop()。
7.3.1·init()
本成员函数在Applet被创建并装入一个能支持Java技术的浏览器
(如appletviewer)时被调用。Applet可用这个方法来初始化数据的值。
本方法只在Applet首次装入时被调用,并且在调用start()之前执行完成。
7.3.2·start()
init()方法一完成,start()就开始执行。它的执行使得Applet成为"活动"的。
无论Applet何时成为可见的,它同样要执行一次,如:当浏览器在被图标化后
又恢复时,或者当浏览器在链接到另
一个URL后又返回含有这个Applet的
页面时。这一方法的典型用法是启动动画和播放声音。
1.public void start() {
2.musicClip.play();
3.}
入门的java游戏小程序7.3.3·stop()
stop()方法是在Applet成为不可见时被调用的,这种情况一般在浏览器被
图标化或链接到另一个URL时会出现。Applet用该方法使动画停止。
1.public void stop() {
2.musicClip.stop();
3.}
start()和stop()形成一对动作:典型地,start()激活Applet中的某一行为,
而stop()则可将它禁止。
7.4·AWT绘图
除了基本的生命周期外,Applet还有与其显示有关的一些重要的方法。这些
方法的声明和文档在AWT组件类中。使用AWT做显示处理时遵循正确的模型是
非常重要的。更新显示由一种被称为AWT线程的独立的线程来完成。这个线程
可用来处理与显示更新相关的两种情况。第一种情况是显露(exposure),
它或在首次显示时,或在部分显示已被破坏而必须刷新时出现。显示的破坏
可能发生在任何时刻,因此,你的程序必须能在任意时刻更新显示。第二种
情况是在程序重画带有新内容的画面时。这种重画可能会要求首先擦除原来
的图像。
7.4.1·Paint(Graphics g)方法
显露处理自动地发生,且导致对paint()方法的一次调用。一种Graphics类
的被称为裁剪矩形的设备常用于对paint()方法进行优化。除非必要,更新
不会完全覆盖整个图形区域,而是严格限制在被破坏的范围内。
7.4.2·repaint()方法
对repaint()的调用可通知系统:你想改变显示,于是系统将调用paint()。
7.4.3·update(Graphics g)方法
repaint()实际上产生了一个调用另一方法update()的AWT线程。update
方法通常清除当前的显示并调用paint()。update()方法可以被修改,
如:为了减少闪烁可不清除显示而直接调用paint()。
7.4.4·方法的交互
下面的框图描述了paint(),update()和repaint()方法间的内在关系。
图略
7.4.5·Applet的显示策略
Applet模型要求你采取一种特定的策略来维护你的显示:
-- 维护一个显示模型。这个模型是对为再次提供显示而所需做的事情的一个
定义。关于如何去做的指令在paint()方法中被具体化;这些指令所用的数据
通常是全局成员变量。
-- 使paint()提供仅仅基于该模型的显示。这使得无论paint()何时被调用,
它都能以一致的方法再生该显示,并正确地处理显露问题。
-- 使得程序对显示的改变,通过更新该模型而调用repaint()方法来进行,
以使update()方法(最终是paint()方法)被AWT线程调用。
注-一个单一AWT线程处理所有的绘图组件和输入事件的分发。应保持
paint()和update()的简单性,以避免它们使AWT线程发生故障的可能性更大;
在极端情况下,你将需要其他线程
的帮助以达到这一目的。有关线程的编程
是模块14的主题。
7.5·什么是appletviewer?
Applet通常运行于一个Web浏览器中,如HotJava TM或Netscape Navigator,
它们有支持Java软件程序运行的能力。为了简化和加速开发过程,JDK应运而生,
它附带有一个专为查看Applet而设计但不支持HTML页面查看的工具。这个工具
就是appletviewer。appletviewer是使你不必使用Web浏览器即可运行
Applet的一个Java应用程序。它犹如一个"最小化的浏览器"。appletviewer
读取命令行中URL所指定的HTML文件。这个文件必须包含装入及执行一个或
多个Applet的指令。appletviewer忽略了所有其他的HTML代码。它不能显示
普通的HTML或嵌人在一个文本页中的Applet。
7.5.1·用appletviewer启动Applet
appletviewer将一个框架样式的区域粘贴在屏幕上,然后实例化该Applet并
将这个Applet实例贴在已有的框架中。appletviewer带有一个命令行参数
形式的URL,它指向一个含有Applet引用的HTML文件。这个Applet引用是
一个指定了appletviewer要装载的代码的HTML标记。
注意,这个标记的通用格式与任何其他的HTML相同,即,用<;和>两个符号来
分隔指令。上例中显示的所有部分都是必需的,你必须使用。
其中
-- archive = archiveList - 这一可选属性描述了一个或多个含有将被
"预装"的类和其他资源的archives。类的装载由带有给定codebase的
AppletClassLoader的一个实例来完成。ArchiveList中的archives以
逗号(,)分隔。
-- code = appletFile.class - 这是一个必需的属性,它给定了含有
已编译好的Applet子类的文件名。也可用package.appletFile.class的
格式来表示。
注-这个文件与你要装入的HTML文件的基URL有关,它不能含有路径名。
要改变Applet的基URL,可使用。
7.6.2·描述
-- width = pixels height = pixels - 这些必需的属性给出了Applet
显示区域的初始宽度和高度(以象素为单位),不包括Applet所产生的任何
窗口或对话框。
-- codebase = codebaseURL - 这一可选属性指定了Applet的基
URL――包含有Applet代码的目录。如果这一属性未指定,则采用文档的URL。
-- alt = alternateText - 这一可选属性指定了当浏览器能读取Applet
标记但不能执行Java Applet时要显示的文本。
-
- name = appletInstanceName - 这个可选属性为Applet实例指定有关
名称,从而使得在同一页面上的Applet可到彼此(以及互相通信)。
-- align = alignment - 这个可选属性指定了Applet的对齐方式。它的
可取值与基本的HTML中IMG标记的相应属性相同,为:left,right,top,
texttop,middle,absmiddle,baseline,bottom和absbottom。
-- vspace = pixels hspace = pixels - 这些可选属性指定了在
Applet上下(vspace)及
左右(hspace)的象素数目。其用法与IMG标记
的vspace和hspace属性相同。
-- - 这个标记
提供了一种可带有由"外部"指定的数值的Applet,它对一个Java应用程序
的作用与命令行参数相同。Applet用getParameter()方法来存取它们的
属性,该方法将在本模块稍后作更详细的讨论。
-- 不支持Java程序执行的浏览器将显示被包括在
标记之间的任何常规的HTML;而可支持Java技术的浏览器则忽略介于这
两个标记之间的HTML代码。
7.7·其他的Applet工具
在Applet中有若干其他特。
所有的Java软件程序都具有访问网络的特,这可使用模块15中所讲到的
java包中的类来实现。此外,Applet还有些其他的方法可允许它们取
得有关自己启动时所在的浏览器环境的信息。类java.URL描述了URL,
并可用于它们之间的连接。在Applet类中有两个方法决定了URL的重要的值:
-
- getDocumentBase()返回一个描述当前浏览器中带有Applet标记的HTML
文件所属页面目录的URL对象
-- getCodeBase()返回一个描述Applet类文件本身源目录的URL对象。它
通常与HTML文件目录相同,但并不是一定要这样。
其他的Applet特
用URL对象作为一个起始点,你可以将声音和图像取回到你的Applet中。
-- getImage(URL base, String target)从被命名为target且位于由
base所指定目录的文件中取回一幅图像。其返回值是类Image的一个实例。
-- getAudioClip(URL base, String target) 从被命名为target且位
于由base所指定目录的文件中取回一声音。其返回值是类Audio Clip的
一个实例。
注-getImage(URL, String)和getAudioClip(URL, String)方法中
的String target能包括一个来自于URL的相对目录路径。但是请注意,
在目录层次中向上的相对路径名,在某些系统上可能是不允许的。
7.8·一个简单的图像测试
下面的Applet获得了相对于getDocumentBase方法返回的目录路径为
graphics/joe.gif的图像文件,并将它显示在appletviewer中:
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() {
12.duke = getImage(getDocumentBase(),
13."graphics/SurferDuke.gif");
14.}
15.
16.public void paint(Graphics g) {
18.}
19.}
drawImage()方法的参数是:
-- 将要被绘出的Image对象
-- 绘图的x轴坐标
-- 绘图的y轴坐标
-- 图像观察者。图像观察者是可以得知该图像的状态是否改变的一个接口
(如:在装入过程中发生了什么)。
由getImage()装载的图像在调用首次提出后过一段时间将会改变,这是
由于装载是在后台完成的。每次,图像的更多部分被装
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论