第9章 applet程序.docx
- 文档编号:16292337
- 上传时间:2023-07-12
- 格式:DOCX
- 页数:19
- 大小:125.53KB
第9章 applet程序.docx
《第9章 applet程序.docx》由会员分享,可在线阅读,更多相关《第9章 applet程序.docx(19页珍藏版)》请在冰点文库上搜索。
第9章applet程序
第9章applet程序
9.1applet简介
Java程序分为application和applet两种类型,在第一章中,我们对两种程序的编写、编译、运行进行了简单介绍,在前序章节中,给出的例子也都是基于application类型的,下面我们来看applet程序。
Applet程序又称为小应用程序,是对“applet”的翻译,实际上applet并一定就是小程序。
Java作为一个网络程序设计语言其重要体现之一就是它独有的applet程序运行模式。
通常applet程序是通过网络下载后在网页浏览器上运行的。
它本身并不能作为一个独立程序单独运行,必须在网页浏览器环境下运行。
区别applet与application的关键是虽有applet程序都是java.applet.Applet或其子类的对象。
作为java.applet.Applet的子类,applet程序在屏幕上显示一个空白方框。
也就是说,只要继承java.applet.Applet类就可以实现一个最简单的applet程序,但他并不具有任何功能,只是显示一个空白方框。
只有重写java.apple.Applet中定义的方法,才能在方框中绘制更为复杂的图形界面。
Applet程序不同与application程序,它本身没有main方法,那么,系统从何处开始运行applet程序呢?
在javaapplet中系统预定义的方法中有多个方法都和main的功能一样,是由系统调用运行的,因此,具体applet从哪开始运行,要看你实现了哪个方法,当然,如果实现了多个方法,这些方法的调用运行还有一个顺序,具体可参见applet生命周期的内容。
需要注意的是,本身这些方法在applet中都是空方法,如果没有重写,就不会做任何事情,感觉跟未调用一样。
9.2applet生命周期
小应用程序的生命周期相对于Application而言较为复杂。
在其生命周期中涉及到Applet类的四个方法(也被JApplet类继承):
init()、start()、stop()和destroy()。
下面首先用图来表示一个小应用程序的生命周期,然后再简要描述这四个方法。
图9-1Applet的生命周期
Applet的生命周期中有四个状态:
初始态、运行态、停止态和消亡态。
当程序执行完init()方法以后,Applet程序就进入了初始态;然后马上执行start()方法,Applet程序进入运行态;当Applet程序所在的浏览器图标化或者是转入其它页面时,该Applet程序马上执行stop()方法,Applet程序进入停止态;在停止态中,如果浏览器又重新装载该Applet程序所在的页面,或者是浏览器从图标中复原,则Applet程序马上调用start()方法,进入运行态;当然,在停止态时,如果浏览器关闭,则Applet程序调用destroy()方法,进入消亡态。
(1)init()方法
创建Applet时执行,只执行一次。
当小应用程序第一次被支持Java的浏览器加载时,便执行该方法。
在小应用程序的生命周期中,只执行一次该方法,因此可以在其中进行一些只执行一次的初始化操作,如处理由浏览器传递进来的参数、添加用户接口组件、加载图像和声音文件等。
小应用程序有默认的构造方法,但它习惯于在init()方法中执行所有的初始化,而不是在默认的构造方法内。
我们可以按住如下格式书写init()方法:
publicvoidinit(){
//具体代码
}
(2)start()方法
多次执行,当浏览器从图标恢复成窗口,或者是返回该主页时执行。
系统在调用完init()方法之后,将自动调用start()方法。
而且每当浏览器从图标恢复为窗口时,或者用户离开包含该小应用程序的主页后又再返回时,系统都会再执行一遍start()方法。
start()方法在小应用程序的生命周期中被调用多次,以启动小应用程序的执行,这一点与init()方法不同。
该方法是小应用程序的主体,在其中可以执行一些需要重复执行的任务或者重新激活一个线程,例如开始动画或播放声音等。
有些程序的功能只有网站在当前被显示时才保持运行,而浏览器来开此网页时应停驶运行,以节省浏览器的资源开销。
start方法通常与下面要介绍的stop方法配合使用。
我们可以按如下格式书写start():
publicvoidstart(){
//具体代码
}
(3)stop()方法
多次执行,当浏览器变成图标时,或者是离开主页时执行,主要功能是停止一些耗用系统资源的工作。
与start()相反,当用户离开小应用程序所在页面或浏览器变成图标时,会自动调用stop()方法。
因此,该方法在生命周期中也被多次调用。
这样使得可以在用户并不注意小应用程序的时候,停止一些耗用系统资源的工作(如中断一个线程),以免影响系统的运行速度,且并不需要去人为地去调用该方法。
当然,如果你的小应用程序中不包含动画、声音等程序,通常也不必重载该方法。
下面是stop()方法的具体定义格式:
publicvoidstop(){
//具体代码
}
(4)destroy()方法
用来释放资源,在stop()之后执行。
浏览器正常关闭时,Java自动调用这个方法。
destroy()方法用于回收任何一个与系统无关的内存资源。
当然,如果这个小应用程序仍然处于活动状态,Java会在调用destroy()之前,调用stop()方法。
destroy方法的具体书写格式如下:
publicvoidstop(){
//具体代码
}
除了上面这四个方法之外,还有一个方法时一个applet生命周期中,一定而且常常会被调用到的。
不过它不算是java.applet.Applet里面定义的方法,而是继承自java.awt.Container类中的paint方法。
从名字分析就知道这个方法是用来绘图的,所以,只要applet要重画整个画面,这个方法就会被调用。
例如,applet第一次启动时会先调用init,然后调用start,接着就是paint方法了,因为所有初始化设置完成后,要把applet的画面显示出来。
当你的浏览器窗口放大、缩小或是被别的窗口遮挡又重新显示时,画面都需要重画,因此也都调用这个方法。
所以说,paint方法调用次数是最频繁的。
paint方法的具体书写格式如下:
publicclasspaint(Graphicsg){
//具体代码
}
提到paint方法就不得不提update()和repaint()方法。
再进行绘图时,系统调用update()方法和paint()方法时,传递的参数就是Graphics类的对象。
因此通过重载update方法和paint方法就能进行图形的绘制。
Paint,update及repaiint的具体说明如下:
paint():
进行绘图的具体操作,必须由程序员重写。
通常由系统自动调用。
update():
用于更新图形,需先清除背景、前景,再调用paint方法
repaint():
用于重绘图形,当applet程序对图形做了某些修改后,需通过调用repaint()方法将变化后的图形显示出来,而repaint方法则会自动调用update方法,然后再调用paint()方法将图形重绘。
下面通过一个具体的例子理解我们给出的applet小程序中各方法的调用过程。
[例9-1]
importjava.applet.Applet;
importjava.awt.Graphics;
publicclassTest9_1extendsApplet{
StringBufferbuffer;
staticintn=0;//paint被调用次数
publicvoidinit(){
setSize(600,300);//设置窗体大小
buffer=newStringBuffer();
addItem("调用init方法;");//调用自定义方法addItem
}
publicvoidstart(){
addItem("调用start方法;");//调用自定义方法addItem
}
publicvoidstop(){
addItem("调用stop方法;");//调用自定义方法addItem
}
publicvoiddestroy(){
addItem("调用destroy方法;");//调用自定义方法addItem
}
//自定义方法,在方法内调用repaint,进而通过repaint调用paint方法
privatevoidaddItem(StringnewWord){
System.out.println(newWord);
buffer.append(newWord);
repaint();//即使不显示调用,系统也会自动调用该方法
}
publicvoidpaint(Graphicsg){
g.drawRect(0,0,getWidth()-1,getHeight()-1);//画一个矩形
n++;//调用次数记录
g.drawString(buffer.toString()+"paint调用次数:
"+n,5,15);//打印内容在applet中
System.out.println("paint调用次数:
"+n);
}
}
程序启动后的运行界面如下图:
图9-2例9-1运行结果
从运行结果看,程序启动后先调用init方法,接着调用start方法,接着paint方法被调用了两次。
取自"
9.3Graphics类
paint方法的主要作用就是在applet中绘图,paint方法的参数为Graphics类的类对象,该类提供了丰富的绘图方法,利用这些方法可以绘制各种图形和文本。
Java语言的图形坐标与我们在数学中我熟知的坐标表示不同,java中,图形原点坐标在屏幕的左上角,水平向右为X正向,垂直向下为Y轴正向,每个坐标点的值表示屏幕上的一个像素点的位置。
Graphics类的常用方法如下表所示:
表9-1Graphics类常用成员方法
方法
说明
drawstring(Strings,intx,inty)
在指定的坐标点处绘制指定文本
drawLine(intx1,inty1,intx2,inty2)
在点(x1, y1)和(x2, y2)之间画一条线
drawRect(int x,int y,
int width,int height)
绘制指定矩形的边框。
(x,y)为矩形左上角坐标,width,height为外接矩形的宽和高
drawOval(int x,int y,
int width,int height)
绘制椭圆的边框。
(x,y)为椭圆外接矩形左上角坐标,width,height为外接矩形的宽和高
下面通过一个例子演示上述几个方法的使用
[例9-2]
importjava.applet.*;
importjava.awt.Graphics;
publicclassTest9_2extendsApplet{
publicvoidpaint(Graphicsg){
g.drawString("打印字符串测试",50,20);//打印字符串
g.drawLine(50,40,130,40);//画直线
g.drawRect(50,60,80,50);//画矩形
g.drawOval(50,120,80,50);//画椭圆
}
}
运行结果如下:
图9-3例9-2运行结果
需要注意的是Graphics类本身是一个抽象类,也就是说,要想使用Graphics类中的抽象方法,必须是实现了其抽象类的子类。
那么这个子类是谁呢?
我们通过在“g.drawString("打印字符串测试",50,20);”语句上加断点的方式找到了答案。
图9-4查看传给g的实参
传给g的实参是一个叫SunGraphics2D的类对象(sun.java2d.SunGraphics2D)。
上面我们绘制的图形都是系统默认的黑色,文字的字体和颜色也都不能选择,那么有什么办法改变绘制图形的颜色以及文字的字体呢?
这就用到了Color类和Font类,这两个类一般不单独使用,主要是为绘制图形和文字等服务的。
9.4Color类
9.4.1Color类构造方法
创建Color类对象需要使用Color类的构造方法,在JDK1.6版本中提供了7个构造方法,这里我们介绍其中三种。
表9-2Color类常用构造方法
构造方法
说明
Color(float r,float g,float b)
创建具有指定红色、绿色和蓝色值的不透明的sRGB颜色,这三个颜色值都在(0.0-1.0)的范围内。
Color(int rgb)
创建具有指定组合的RGB值的不透明的sRGB颜色,此sRGB值的16-23位表示红色分量,8-15位表示绿色分量,0-7位表示蓝色分量。
Color(int r,int g,int b)
创建具有指定红色、绿色和蓝色值的不透明的sRGB颜色,这些值都在(0-255)的范围内。
三种构造方法都需要制定颜色中的R(红)、G(绿)、B(蓝)三色的比例,只是方式不同,对于R、G、B三色来说,谁的值越大,最终的颜色中该颜色所占的量也就越大。
9.4.2Color类的数据成员
这种定义颜色的方式非常灵活,可以创建出任何你想要的颜色,但有时候如果不了解具体的R、G、B三个的组成,不容易得到自己想要的颜色,因此,java中还提供了一些常用颜色的Color类的数据成员常量,可以通过Color类直接使用。
见表9-3。
表9-3Color静态数据成员
数据成员常量
所对应颜色
staticColorblack
黑色
staticColorblue
蓝色
staticColorcyan
青色
staticColordarkGray
深灰色
staticColorgray
灰色
staticColorgreen
绿色
staticColorlightGray
浅灰色
staticColormagenta
洋红色
staticColororange
桔黄色
staticColorpink
粉红色
staticColorred
红色
staticColorwhite
白色
staticColoryellow
黄色
这些数据常量数据成员还有其对应的大写形式,如black对应的大写形式为BLACK,darkGray对应的大写形式为DARK_GRAY,其规律就是,如果表示颜色的单词是一个单词,那么其对应的大写形式是该单词全大写;如果表示颜色的单词是两个单词连接起来的,那么其对应的大写形式是将两个单词大写,中间用“_”连接。
9.4.2Color类的成员方法
创建了Color的类对象后,我们就可以使用Color的成员方法了,Color的成员方法见下表9-4。
表9-4Color类成员方法
成员方法
说明
publicColordarker()
创建一个新Color,它具有比此Color更暗的颜色。
publicColorbrighter()
创建一个新Color,它具有比此Color更亮的颜色。
publicintgetRed()
返回默认sRGB空间中位于范围0-255中的红色分量。
publicintgetGreen()
返回默认sRGB空间中位于范围0-255中的绿色分量。
publicintgetBlue()
返回默认sRGB空间中位于范围0-255中的蓝色分量。
修改例9-2,为文字和图形加上不同的颜色。
[例9-3]
importjava.applet.*;
importjava.awt.Color;
importjava.awt.Graphics;
publicclassTest9_3extendsApplet{
publicvoidpaint(Graphicsg){
g.setColor(Color.blue);
g.drawString("打印字符串测试",50,20);//打印字符串
g.setColor(newColor(0,255,0));
g.drawLine(50,40,130,40);//画直线
g.setColor(newColor(1f,0f,0f));//注意1f表示是一个float类型的常量
g.drawRect(50,60,80,50);//画矩形
g.setColor(newColor(255));//将255写成二进制,其前八位正好对应蓝色,绿色和红色部分为0
g.drawOval(50,120,80,50);//画椭圆
}
}
图9-5例9-3运行结果
我们通过为每个即将绘制的语句前添加一个g.setColor()方法的方式来改变绘制的颜色,对于g对象来说,如果我们不使用g.setColor()方法设置颜色,那么它就会一直以某一种获取的颜色来绘制,也就是说,如果我们将后三条g.setColor语句去掉,那么所有图形及文字的绘制颜色都将是“g.setColor(Color.blue);”语句所设置的蓝色。
9.5Font类
9.5.1Font类构造方法
利用构造方法可以创建Font类的类对象,以供其他方法使用,Font的构造方法如下:
表9-5Font类构造方法
构造方法
说明
protectedFont(Font font)
根据指定font创建一个新Font,此构造方法由子类使用。
JDK1.6新增
publicFont(String name,int style,int size)
根据指定名称、样式和磅值大小,创建一个新Font。
第一个构造方法是JDK1.6版本新增的一个构造方法,该构造方法允许使用一个现有的Font类对象作为构造方法的参数。
第二个构造方法需要指定字体的名称(name),字体的样式(style,本身为int型,可以通过Font的静态数据成员获得),字体大小(size,int型),如Fontf=newFont("黑体",Font.BOLD,28)
9.5.2Font类的数据成员
表9-6Font类常用数据成员
数据成员
说明
publicstaticfinalintITALIC
斜体样式常量
publicstaticfinalintBOLD
粗体样式常量
publicstaticfinalintPLAIN
普通样式常量
这里给出的数据成员均为静态的,因此在使用时可直接用Font调用。
9.5.3Font类的成员方法
表9-7Font类常用成员方法
成员方法
说明
publicStringgetFontName()
返回此Font的字体外观名称
publicintgetSize()
返回此Font的磅值大小,舍入为整数
publicintgetStyle()
返回此Font的样式
publicbooleanisBold()
指示此Font对象的样式是否为BOLD。
publicbooleanisItalic()
指示此Font对象的样式是否为ITALIC
publicbooleanisPlain()
指示此Font对象的样式是否为PLAIN
给出的成员方法主要是获取当前字体的外观名称、字体样式和字体大小,还能够对字体样式进行判断。
关于Font部分在applet中的验证我们不在单写程序进行了,有兴趣的读者可以在例9-3的基础上添加g.setFont语句来验证。
9.6applet安全性
“安全”是java当初被设计时强调的一个重点,也正因为java对程序的安全要求非常的严格,所以才能写出稳定且不具有破坏性的程序。
Applet程序对安全的要求又比application程序更为严格,因为applet程序是放到网页上,让别的用户下载到本机电脑上运行的。
在当今电脑病毒猖獗的时代,我们一般不会轻易去运行一个来路不明的程序。
但applet程序符合java指定的重重安全规范,所以一般我们可以放心的下载applet程序来运行,那么,applet到底有哪些运行上的约束来保证它对本机无危害呢?
(1)Applet不能带本地文件作任何形式的使用,如读取、写入、删除、更改文件名、获取文件创建日期、文件大小等,甚至对于一个文件检查其是否存在都做不到。
所以我们不必担心运行一个applet程序后,电脑中的数据会被窃取或破坏,当然,除非你自己允许让这个applet程序做这些事情。
(2)Applet不能通过网络连接到其他电脑,唯一能连接的就是它所在网页的那台电脑。
(3)Applet不能使用系统及的API,如读取系统参数、使用JNI接口等。
(4)Applet不能自行更改这些安全性的限制,以防止这些安全限制失效。
从上面的叙述中,我们看到applet由于有多种限制,所能做的事情并不是很多,通常它们用于显示图片、播放声音、获取用户的键盘输入和鼠标点击,或者更进一步可以编写一些applet小游戏,这些小游戏可以通过键盘、鼠标与用户进行交互。
9.7applet中的参数和参数传递
在第5章数组中,我们介绍了main中的字符串数组参数args,它可以作为application程序的参数使用。
对于appet程序来说,其本身并没有main方法,当然也就无从谈起args参数了,那么,applet小程序能不能像application程序一样,带有输入参数呢?
由于applet的运行方式与application不同,它通常需要嵌入到html网页中运行,因此,在网页代码中可以添加applet小程序的输入参数。
通常放在html文件的Applet标记中,下面给出标准的Applet标记语法。
(1)archive属性
这是个可选属性,用来指示Applet执行前辈预先载入的类字节码或者是其他资源的压缩文件(*.j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第9章 applet程序 applet 程序