java-西安职业技术学院_第1页
java-西安职业技术学院_第2页
java-西安职业技术学院_第3页
java-西安职业技术学院_第4页
java-西安职业技术学院_第5页
已阅读5页,还剩274页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第九章Java

Applet西安职业技术学院动漫软件学院第九章 Java

Applet

及GUI设计Applet的工作原理Applet类的使用Applet与html文件的配合绘制用户自定义成分Java中的动画编程GUI设计Java

AWT事件处理机制S

wing基础Java小应用程序(Java

Applet)是使用Java语言编写的一段代码,Applet是一种为通过

Web浏览器在Internet上工作而设计的Java程序。它能够在浏览器环境中运行。并由支持Java的Web浏览器来解释执行。Applet与Application地主要区别在于它们的执行方

式不同:Application是使用命令行命令直接运行,从其

main()方法开始运行的;而Applet则是在浏览器中运行的,首先必须创建一个HTML文件,它嵌入在HTML网页中,通过

编写HTML语言代码告诉浏览器载入何种Applet以及如何运

行,再在浏览器中给出该HTML文件的URL地址即可,Applet本身的执行过程也较Application复杂。9.1、

Applet的工作原理1、

Java

Applet的基本概念Applet的主要作用:形成动态可交换式的网页,并可利用浏览器中所提供的图形功能显示及处理图像处理用户界面、网络通讯、用户事件处理、访问后台数据库等功能。在Java出现之前,人们就已经开始使用HTML(超文本标记语言)进行Web页面的设计了。然而,对

HTML稍有了解的人都知道,HTML所提供的设计

能力是极其有限的。Java率先提供了让Web页面实现更丰富的GUI和逻辑运算能力的方法,这种方法是通过将一个Java的类插入到Web页面中来实现的。Applet的工作原理如图所示下载html文件请求Applet字节码下载Applet字节码WWW服务器WWW服务器请求html文件解释执行Applet字节码Applet的工作原理WWW服务器html文件Applet嵌入

Applet标记名9.2、Applet类的使用1.Applet类层次要编写一个Applet,必须首先从java.applet.Applet派生一个类:import

java.applet.*;public

class

SimpleApplet

extends

Applet{…}需要注意的是,派生出的Applet的类必须定义为public类型。java.applet.Applet类实际上是java.awt.Panel的子类。Applet和AWT类的继承关系如图所示。这种层次关系显示,而Applet类又是

java.awt.Panel类的子类,因而具有

Component类的能力,同时它又是一个

Container类的子类,可以直接包含其他组件并加以布局。Component,Container

和Panel类的方法被Applet类继承了下来。2.Applet生命周期如何编写一个Applet并令它在浏览器中执行呢?方法很简单,只要继承java.applet包下的Applet类,并实现一些必要的方法即可。Applet的加载、执行、卸载不同于一般的

Java应用程序,其内的主要成员函数分别

对应于Applet生命周期的不同阶段的活动。下载实例化init()初始化start()启动stop()暂停destroy()终止启动转入后台重新激活退出·

Applet的生命周期运行态离开web页面:极小化或装入其他页面,调用stop()方法停止态重新装入或改变页面大小或返回Web页面,调用start()方法关闭浏览器,调用destroy()方法消亡态初始态(瞬态)第一次装入,构造applet类,调用init()方法

调用start()方法3.Applet类中的主要成员方法Applet根据执行过程中发生的事件来定义其生命周期。对于每个事件将自动调用一种方法。方法如下:init():初始化方法它在Applet程序第一次被执行或重新再被执行时被调用1>执行时机:当Applet程序初始下载时浏览器首先执它2>特点:只被调用一次。3>用途:用户重定义出它,从而达到创建出其他对象、初始状态设置、图像加载及外观特征参数的改变等。start():开始函数1>执行时机:它是在Applet的init()函数调用之后被浏览器用;用户又切换回到本Applet页面;浏览器从图标状态恢复为窗口时被调用。2>特点:可能被多次执行(而且都是在页面可见时被调用)。3>用途:用户重定义出它,在其内创建并启动线程以实现特定的功能。stop():终止函数它与start()交替执行。1>执行时机:当用户退出浏览器时被浏览器调用;当用户离开Applet所在的页面;浏览器变为图标状态时。2>特点:可能被多次执行(而且都是在页面不可见时被调用)。3>用途:用户重定义出它,在其内终止线程以终止特定的功能。paint(Graphics

g):绘制图形函数它用于在浏览器的客户区(GUI)中显示出文本、图像等1>特点:可多次被调用,并且可由AWT的绘制处理线程自动调用。2>用途:用户重定义出它,以显示出Applet面板区域内各个组件及外观特征和显示出文本、图像、图形等。3>定义的形式:public

void

paint(Graphics

g){

//显示出Applet面板区域内各组件外观}调用Graphics类中的各种成员函数来实现绘制输出,用户也可调用repaint()、update()来间接地调用paint以实现立即显示外观属性的改变。destroy():消毁函数它在Applet结束时被调用,以允许Applet做最后清理任务(离线时释放本对象及其相关的资源)用途:由于stop()在destroy()之前被执行,用户一般不必覆盖它,而只需覆盖stop()即可。Applet的类层次及框架结构:import

java.awt.*;import

java.applet.*;public

class

AppletClassName

extends

Applet{public

void

init(){//初始化变量、装载图片、读取参数值等}public

void

start(){//启动程序执行或恢复程序执行}public

void

stop(){//挂起正在执行的程序,暂停程序的执行}public

void

destroy(){//终止程序的执行释放资源}public

void

paint(Graphics

g){//完成绘制图形等操作}}StringBuffer

buffer;public

void

init(){buffer

=

new

StringBuffer();addItem("initializing...

");}public

void

start(){addItem("starting...

");}public

void

stop(){addItem("stopping...

");}public

class

SimpleApplet

extends

Applpeutblic

void

destroy(){

{addItem("preparing

forunloading(destroy)...");}void

addItem(String

newWord){System.out.println(newWord);buffer.append(newWord);repaint();}public

void

paint(Graphics

g){g.drawRect(0,

0,

getSize().width

-getSize().height

-

1)g.drawString(buffer.toString(),

5}}SimpleApplet.java2、小应用程序的执行——Applet的运行控制除了Applet生命周期控制的方法外,Applet类还提供了一些其他有用的方法:public

AppletContext

getAppletContext()public

String

getAppletInfo():应该被重写public

URL

getDocumentBase()public

URL

getCodeBase()public

String

getParameter(String

name)public

String[][]getParameterInfo():应该被重public

void

showStatus(String

msg)1.html中的Applet标记<

APPLET[CODEBASE

=

codebaseURL]CODE

=

appletFile[ALT

=

alternateText][NAME

=

appletInstanceName]WIDTH

=

pixels

HEIGHT

=

pixels[ALIGN

=

alignment][VSPACE

=

pixels]

[HSPACE

=

pixels]>[<

PARAM

NAME

=

appletParameter1

VALUE

=

value

>][<

PARAM

NAME

=

appletParameter2

VALUE

=

value

>].

.

.[alternateHTML]</APPLET>9.3、Applet与html文件的配合CODEBASE

=

codebaseURL指明Applet类文件所在URL基址,在Applet类中,方法getCodeBase()可以获取该属性。如果这个属性没有指明,那么Applet类文件必须与包含它的HTML页面在同一个地方,方法getCodeBase()返回的值与getDocumentBase()相同。CODE

=

appletFile指明需要运行的Applet类文件(.class文件),该文件是与codebaseURL相关的。NAME

=

appletInstanceName给出了Applet类运行时的实例名,这使得同处于一个页面的不同Applet之间能够相互通信。方法getAppletContext()可以得到同一个方页面中其它Applet类。ALT

=

alternateText如果浏览器支持Applet但不能运行它,就显示alternateText中所给出的文字。否则就忽略它。WIDTH

=

pixels

HEIGHT

=

pixelsApplet在浏览器中所显示的高度和宽度(以象素为单位)。ALIGN

=

alignmentApplet在浏览器中显示时的对齐方式,其含义与效果与图片在HTML中的一样。其取值有:left,right,top,texttop,middle,absmiddlbaseline,bottom,absbottom。VSPACE

=

pixels

HSPACE

=

pixelsApplet在浏览器中显示时上下、左右要预留的高度和宽度,其含义与效果与图片在HTML中的一样。2、小应用程序的执行——Applet与HTML<

PARAM

NAME

=

appletParameter1

VALUE

=

value

><PARAM>属性可以使得Applet能够从页面中获取所需的参数。Applet可以用其方法getParameter()获取<PARAM>属性指定的参数。<PARAM>属性的作用与应用程序中main()方法里参数String

args[]的作用是一样的。一个好的小应用程序,应该提供用户能够设置外部参数的功能,以使得用户能够根据自己的需要来应用它。方法getParameterInfo()可以得到有关<PARAM>属性的说明信息。alternateHTML如果浏览器不支持Applet,就解释alternateHTML所给出的HTML代码。否则就忽略它。2、小应用程序的执行——Applet与HTMLpublic

class

AppletParaextends

Applet{String

s1,s2;public

void

init(){s1

=

getParameter("p1");

s2

=

getParameter("p2");}public

void

paint(Graphics

g){g.drawString(s1,10,10);g.drawString(s2,10,30);}}<HTML><HEAD><TITLE>Applet

Parameter

Test</TITLE></HEAD><applet

code=“AppletPara.class"width=300

height=300><param

name=p1

value="1111111"><param

name=p2

value="2222222"></applet></HTML>两个步骤:在Applet类中:s1

=

getParameter("p1");在页面中设置Applet参数:<param

name=p1

value="1111111">AppletPara.java2、Applet与HTML9.4

绘制用户自定义成分(图形、文本、图像绘制相关知识)有关的类及绘制函数:java.awt包中的

Graphics类;然后调用Graphics类中的相应的绘制图形、绘制文本、绘制图像等函数以输出图形、文本、图像。编程方法:先利用java.awt包中的Graphics类对象(它代表当前当前组件的绘图环境),然后调用

Graphics类中相应的绘制函数。绘制的时机:①外形发生变化时(如窗口的大小、位置、图标化等显示区域更新时),AWT自动从高层直到叶结点组件相应地调用各组件的paint()方法,但这可能有一个迟后感。②

程序员也可直接调用某一个组件的repaint()(系统再调用update()以清除背景区域,系统再

调用paint()实现输出;如直接调用paint()将保留上次的屏幕输出,故不直接调用paint()),以立即更新外观(如在添加新的显示内容后)。③AWT响应外部的事件时(如首先显示于屏幕或需刷新时),AWT也会直接调用repaint()函数。4.如何获取Graphics类对象并绘制:绘制之前,必须先获取Graphics类对象,因为它包含有当前组件的绘图环境,从而实现在图形窗口下输出。方法一:在paint()内则可通过其形参(它代表当前组件的绘图环境),从而调用Graphics类中的相关的绘制成员函数。public

void

paint(Graphics

g){ .drawString("Java

Text",x,y);}方法二:先在组件类(如Applet或窗框Frame的其他成员函数)中调用getGraphics()来获取当前组件的绘图环境,再强制绘制输出,从而可在paint()函数之外产生绘制动作)。public

void

myFun(){Graphics

g=getGraphics();

//获取当前组件的绘图环境g.drawString("Java

Text",x,y);//强制绘制输出}5.Graphics类中的图形函数(参见类库手册):drawLine(int

x1,

int

y1,

int

x2,

int

y2);drawArc(int

x,int

y,int

width,

int

height,

int

starint

arcAngle);实例:设计一个自由笔(铅笔)。public

void

mouseDrag(Event

evt,

int

x,

int

y){Graphics

g=getGraphics()

;g.setColor(Color.red)

;g.drawLine(x,

y,

x,

y

)

;}6.Java中文字串输出文本控制台方式下输出文字串:

System.out.print(“待输出的文字串”);图形窗口环境下输出文字串:应调用Graphics类中相应的输出函数:

g.drawString(“待输出的文字串”,x,

y);7.图形、文字的颜色Color:可以利用

Color类设置或获取某一容器组件内的图形、文字的颜色。编程方法:利用Color类创建出一Color类对象并设置颜色特性参数(三基色的分量);调用Graphics类中的setColor()将用户的颜色加入到系统中;再调用绘制函数输出图形、文字等。public

void

paint(Graphics

g){Color

myColor=

new

Color(red,

green,

blue);g.setColor(myColor);g.drawString(“这是Java中的带颜色的文字串”,100,100);g.drawRect(

10,10,100

,100)

;}要点:了解颜色的变化规律;Java

JDK中预定义了

13种常量颜色(如:Color.red、Color.green等)对Java的组件也可借助于

setBackground()/setForeground()、getBackground()/getForeground()来改变或获取组件的前景和背景色。8.图形文字的字体Font:可以利用Font类设置或获取某一容器组件内的文字字体。编程方法:利用Font类创建出一Font类对象并设置字体特性参数;调用Graphics类中的setFont()将用户字体加入到系统中;再调用绘制函数输出文字(也可以设置按钮等基本控件的字体OK.setFont())。public

void

paint(Graphics

g){Font

myFont=

new

Font(“Dialog”,

Font.BOLD,20);g.setFont(myFont);g.drawString(“这是Java中的Dialog字体的文字串”,100,100);}字体:TimesRoman

Helvetica

Courier

Dialog字体的尺寸FontMetrics:drawString()函数中的字符位置坐标x、y含义(字符串的左下角);获知字符或字符串的宽度(stringWidth()、charWidth())。获取文字字体的尺寸法:FontMetrics

fm=g.getFontMetrics();fm.getHeight();Java

Applet中声音编程:编程要点:先加载声音文件;再播放它。.au,

wav,midi,rmf编程方法:方法一:在Applet程序中直接调用play()函数。play(getDocumentBase(),“mySound.au”);但此方法的缺点是用户无法控制它。方法二:AudioClip

sound=getAudioClip(

getDocumentBase(),

“mySound

.

au”);sound.play();

//或sound.stop();讨论P309

8.8,补充题:1、编程:在APPLET中绘制图形,如:

“圆”、“椭圆”“矩形”,等图形以及字体、颜色设置。编程:在APPLET中播放声音文件、显示图像、动画演示。11. Java中图像编程:有关的包与类:在java.awt包、java.awt.image包、都有与图像有关的类Image。图像编程的要点:先加载图像(将它化为Image类对象);再跟踪图像的加载过程;最后显示出图像在Applet及Application程序中载入图像的方式。加载图像:①Java

Applet中加载图像:直接调用ImagemyImage=getImage(URL

address,imageFileName);②Java

Application中加载图像:利用Image

myImage=Toolkit.getDefaultToolkit.

getImage(imageFileName);加载图像。Image

myImage

=Toolkit

.getDefaultToolki()

.getImage(imageFileName);Toolkit

Tool;Tool=

Toolkit

.getDefaultToolkit();Image

myImage

=Tool.getImage(imageFileName);(3)显示出图像:调用Graphics类中的drawImage(Imageimage

,

int

x,

int

y

,

ImageObserverobserver)显示出图像,其中第四个参数可以为null(不跟踪图像载入时)或this(跟踪图像载入时,跟踪者为本程序)。9.5 Java中的动画编程:动画原理:画出一系列的图像帧,利用人眼的视觉暂停来造成运动的感觉。常见的动画效果及实现原理(利用线程达到循环显示输出):①运动效果:平动改变文字在显示时g.drawStrin的x,y坐标位置或g.drawImage()中的x,y坐标位置;规则运动如果x,y之间满足一定的数学规则。②变焦(由远到近文字由小到大;由近到远字由大到小):利用线程不断地改变文字的字体大小或图像的大小。③淡入淡出:利用线程不断地改变文字的颜色并将颜色按某种规则变化。动画的质量:除了图片本身的好坏外,动画中动作的平滑程度也是一大关键(每秒所播放的图像数较

多,动画中动作的平滑程度则较高,10~20帧/秒);动画的速度则可利用Java的线程来实现并用

threadObj.sleep()来延迟以控制动画的速度。动画的图像载入编程技巧:利用getImage()函数并用Image数组来存放各个Image对象,同时为利用一个for()循环来将图片全部载入,应而各个图像文件名也应有要求(一般可采用数字编码来命名文件名);注意只有在图像文件全部加载完毕以后再显示出,否则会断续显示,这可由MediaTracker类中的waitForAll()方法实现对图像载入过程的跟踪。动画的载体:文字或图像动画实例1:文字淡入淡出动画原理:利用new创建一个线程,用

drawString()在屏幕指定位置显示出文字,然后让线程休眠一段时间,再改变文字显示的

位置或颜色,最后再显示文字(其中包括边

界判断、重设坐标)。编程技巧:可利用Graphics类中的

clipRect()函数用于限定绘制范围,从而减少清屏的区域以避免图像闪烁。实例2:图像动画import

java.applet.Applet;import

java.awt.*;public

class

img1

extends

Appletm_Images;{Image[]int

sum=18;int

cur=0;String

strImage;public

void

init(){m_Images[]=new

Image[18];for

(int

i

=0;

i

<

sum;

i++){strImage

=

"images/img00"

+

((i

<

10)

?

"0"

:

"")

+

i

+

".gif";m_Images[i]

=

getImage(getDocumentBase(),

strImage);}}public

void

start(){cur=0;}public

void

paint(Graphics

g){g.drawImage(m_Images[cur],50,50,this);cur=++cur%sum;try{Thread.sleep(50);}catch(InterruptedException

e){showStatus(e.toString());}repaint();}}{public

String

s;public

void

init(){s

=

new

String(“HelloWorld!”);}public

void

paint(Graphics

g){g.drawString(s,25,25);}}Frame

f

=

new

Frame(“Applet-App”);AppletApp

app

=

new

AppletApp();f.add(app,“Center”);f.setSize(200,

200);f.setVisible(true);f.addWindowListener(

new

WindowAdapter(){public

void

windowClosing(WindowEvent

e){System.exit(0);}});app.init();app.start();}AppletApp.java2、小应用程序的执行——Applet与Application一个Java类文件可以既是一个Java

Applet,又是一个Java

Application,只不过在编写时稍微复杂一些而已,但它却既可以在浏览器中运行,又可以作为Application单独运行。public

static

void

main(Stringargs[]

)public

class

AppletApp

extends

Apple{t8.图形文字的字体Font:可以利用Font类设置或获取某一容器组件内的文字字体。编程方法:利用Font类创建出一Font类对象并设置字体特性参数;调用Graphics类中的setFont()将用户字体加入到系统中;再调用绘制函数输出文字(也可以设置按钮等基本控件的字体OK.setFont())。public

void

paint(Graphics

g){Font

myFont=

new

Font(“Dialog”,

Font.BOLD,20);g.setFont(myFont);g.drawString(“这是Java中的Dialog字体的文字串”,100,100);字体的尺寸FontMetrics:drawString()函数中的字符位置坐标x、y含义(字符串的左下角);获知字符或字符串的宽度(stringWidth()、

charWidth())。获取文字字体的尺寸方法:FontMetrics

fm=g.getFontMetrics();fm.getHeight();Java

Applet中声音编程:(1)编程要点:先加载声音文件;再播放它。

(2)编程方法:方法一:在Applet程序中直接调用play()函数。

play(getDocumentBase(),

“mySound

.au”);但此方法的缺点是用户无法控制它。方法二:

AudioClip

sound=getAudioClip(

getDocumentBase(),“mySound

.

au”);sound.play();

//或

sound.stop();Java

Applet浏览器是指可以运行包含Applet的HTML文

件的一切软件系统。HotJava、Netscape

Navigator以及Microsoft

Internet

Explorer等支持Java的网络浏览器都是Applet浏览器,Java

Applet都可以在其中运行。AppletViewer是一个Java应用程序,它可以使得用户无须使用网络浏览器而直接运行Java

Applet。但AppletViewer仅仅是一个Applet浏览器,HTML文件中的其他内容将不会

被显示出来。AppletViewer是从java.awt.Frame中继承而来。使用方法:AppletViewer<HTML

file

or

URL>2、小应用程序的执行——Java

Applet浏览器3、图形操作——paint()、update()和repaint()Applet本身是一个AWT组件,因此它也具有一般AWT

组件的图形绘制功能。Applet中有三个显示相关的方法:

paint()、update()和repaint()。Applet的显示更新是由一个AWT线程来控制完成的,它主要负责两种显示更新情况:第一是暴光,表示部分显示区域被遮盖、调整大小、最大最小化等,这种情况随时会发生,需要系统调用paint()方法;第二是程序需要重画显示区域,添加一些新的显示内容,需要程序调用repaint()方法。AWT

thread(waiting)update():clear

areacall

paint()paint()程序调用

repaint()Exposure:遮盖、调整大小、最大最小化等3、图形操作——paint()、update()和repaint()·

paint(Graphics

g

)方法Applet本身是一个容器,因此任何输出都必须用图形方法paint()。当小应用首次被装载,以及每次窗口放大、缩小、刷新时都要调用paint()方法。paint()是由AWT线程调用的,而不是由程序调用,当程序希望调用paint方法时,用repaint方法。paint()方法的参数是Graphics类的对象g,该对象不是由new产生的,而是由系统或其他方式直接将生好的Graphics对象当作方法的参数,再交给paint()方法。paint()方法必须被重写以绘制自己所需的内容。3、图形操作——paint()、update()和repaint()3、图形操作——paint()、update()和repaint()update()方法update()方法用于更新图形。它首先清除背景,然后设置前景,再调用paint()方法完成Applet中的具体绘图。一般不重写update()方法。repaint()方法repaint()方法主要用于重绘图形,它是通过调用update()法来实现图形重绘的。当组件外形发生变化时,系统自动调用repaint()方法。AWT线程要处理组件的绘图工作,并负责其输入事件,因此必须尽量缩短paint()方法和update()方法的长度,特别在paint()方法中,不要执行太消耗时间的操作。3、图形操作——Graphics、Font和Color类的使用在paint()方法中有一个Graphics类参数,它是画图的关键。它支持两种绘制:一是基本的绘图,包括画点、线、矩形、文字等;二是画图象。在

进行基本画图时,可以设定所需的颜色和字体等,这需要用到Font、FontMetrics和Color三个类。有关这几个类的使用以及相互关系,请大家课后自己学习。3、图形操作——Applet中的事件处理Applet本身是一个AWT组件,因此可以对其中所发生的事件进行处理,其处理与前面所讲的图形用户界面程序的设计是一样的。SimpleClick.java3、图形操作——添加其它AWT组件Applet是从java.awt.Panel继承而来,因此它本身也是一个容器,可以往其中添加其他的AWT组件,从而构造更复杂、更有用的Applet程序。往Applet中添加其他组件及其事件处理与前面所讲的图形用户界面程序的设计是一样的。ArcTest.java4、小应用程序的通信——同页Applet之间的通信嵌入同一页中的Applet之间可以通过java.applet包中提供的方法直接进行通信。首先,利用Applet类中的方法getAppletContext()得到当前运行页的上下文环境AppletContext对象:public

AppletContext

getAppletContext();通过AppletContext对象,就可以得到当前Applet运行环境的信息。接口AppletContext中定义了方法getApplets()可以得到当前页中的其他Applet对象。public

abstract

Applet

getApplets(String

name);public

abstract

Enumeration

getApplets();(Enumeration中提供了方法hasMoreElements()和nextElement()来获取其中的元素。)得到同页中的其他Applet对象后,就可以调用这些Applet的public方法,从而达到同页Applet之间通信的目的。4、小应用程序的通信——同页Applet之间的通信三个Applets:(AmongApplets.java)GetApplets:获取同页中其它Applets的信息。Sender:获取同页中的Applet“Receiver”,并通过其方法向它发送消息。Receiver:接收同页中Applet“Sender”的消息。<HTML><HEAD><TITLE>Communication

among

Appelt

in

same

page.</TITLE></HEAD><applet

code=Sender.class

width=450

height=200

name="I"m

Sender"><param

name="receiverName"

value="I"m

Receiver"></applet><p><applet

code=Receiver.class

width=450

height=35><param

name="name"

value="I"m

Receiver"></applet><p><applet

code=GetApplets.class

width=400

height=150></applet></HTML>4、小应用程序的通信——Applet和浏览器之间的通信Applet中提供了很多函数来与显示它的浏览器之间进行通信:public

URL

getCodeBase()public

URL

getDocumentBase()public

String

getParameter(String

name)public

void

showStatus(String

msg)publicAppletContext

getAppletContext()Applet可以用这四个方法从浏览器中获取信息或者向浏览器发送信息。public

String[][]

getParameterInfo()public

String

getAppletInfo()浏览器可以使用Applet的这两个方法来获取Applet的相关信息。4、小应用程序的通信——Applet和浏览器之间的通信public

AppletContext

getAppletContext()同一页面不同Applet之间的通信也是要通过这个方法来获得起运行环境的(AppletContext),再利用AppletContext提供的方法getApplet()来获取其它的Applet从而达到相互通信的目的。AppletContext中还提供了showDocument()方法来向浏览器发送请求,以显示一个URL页面:void

showDocument(

URL

url)void

showDocument(

URL

url,

String

target

)4、小应用程序的通信——Applet和浏览器之间的通信void

showDocument(

URL

url)指定的HTML页面将在Applet所在地浏览器窗口中显示。void

showDocument(

URL

url,

String

target

)在本方法中,可以指明显示HTML页面的窗口,target就是用来指明在浏览器窗口的,不同的取值指明了不同的窗口:“_self”:在Applet所在的窗口中显示HTML页面“_parent”: 在Applet所在的窗口的父窗口中显示HTML页面“_top”:在最前面的窗口中显示HTML页面“_blank”: 在新的窗口中显示HTML页面name: 在指定名称的窗口中显示HTML页面ShowDocument.java4、小应用程序的通信——Applet的网络通信在Applet中可以进行网络通信,但是由于安全性的限制,Applet只能和提供它的主机进行通信。通过类Applet的getCodeBase()方法获得提供它的主机的URL实例利用类URL的getHost()方法得到主机名利用类InetAddress的getByName()得到该主机的IP地址通过IP地址,就可以进行网络通信(TCP,UDP)URL

url

=

getCodeBase();String

host

=

url.getHost();Try{InetAddress

address

=

InetAddress.getByName(host);}catch(Exception

e){}Try{DatagramSocket

socket

=

new

DatagramSocket();DatagramPacket

packet

=

new

DatagramPacket(buf,

length,

address,

port);socket.send(packet);}catch(Exception

e){}小结小应用程序是在浏览器中运行的,每个小应用程序中必须有一个主类,冠以public,并且继承自java.applet。小应用程序包括生命周期的四个环节和paint()方法。根据程序要求,用户可以在主类中定义其它方法,或定义其它类。public

class

myapplet

extends

Applet{init()

{…}start()

{…}stop()

{…}destroy()

{…}paint(Graphics

g){…}myMethod(){…}}class

myclass1{…};class

myclass2{…};applet主类stop()自定义方法init()applet启动后第一个被执行,在此初始化start()init()后被执行,程序主要代码写在此paint()start()后被执行,写与绘制有关的代码浏览器变换页面时执行,可以省略、重写destroy()浏览器关闭时执行,可以省略重写不能自动被执行,可以由前三个方法调用。例如:

start(){

myMethod();

…}myClass1myMethod1myMethode2myClasse1

myclass

=new

myClass1();.m.yclass1.myMethod1();class

myClass1{int

v1;public

void

myMethod(int

num){v1=num;}}public

class

Demo

extends

Applet{public

void

init(){myclass1

test1=new

myClass1();test1.myMethod(20);myClass1

test2

=

newmyClass1();test2.myMethod(10);}}v1test2v12010Demo

Instancetest1内存小结设计一个Applet,应:使用getParameter()方法,以便用户能够自定义Applet的运行参数。重写getParameterInfo()方法,帮助用户得到外部参数的说明信息。重写getAppletInfo()方法,帮助用户得到有关Applet的说明信息。准备提交一个Applet之前,应:去掉(隐去)调试信息一定要在stop()方法中终止一些消耗资源的运行。思考什么是JavaApplet,它和Application的区别是什么?如何创建Java

Applet?Applet的生命周期及主要方法是什么?Applet的用途和用法是什么?9.6

GUI设计GUI界面:用户与程序之间交互的一个控制面板,其内包含有菜单,控件(或组件),容器,用户自定义成分并能响应用户的事件。Java中的GUI实现方式:采用AWT(Abstract

Window

Toolkit)(抽象窗口工具集),

AWT是Java开发工具包(JDK)的一部分,是Java基本类(JFC)的核心。AWT的作用是给用户提供基本的界面组件,如:窗口、按键、菜单等。此外,

AWT还提供事件处理结构,支持剪贴板、数据传输和图像操作。从而可使GUI适用于不同OS的环境。特点:(1)具体实现由目标平台下的OS来解释,从而导致Java

GUI在不同平台下会出现不同的运行效果(窗口外观、字体显示效果会发生变化);(2)组件在设计时不应采用绝对定位,而应采用布局管理器来实现相对定位,以达到与平台及设备无关;(3)AWT组件及事件响应不及微软的SDK丰富(因为有些OS平台无微软的Windows组件),这个目标并没有很好的实现。这种情况从Java

1.1以后得到了大的改进。Sun从Java

1.2开始,AWT添加了被称为“Swing”的新GUI库。Swing是基于AWT基本结构创建的二级

用户界面工具集。与旧的AWT相比,Swing提供更加丰富的组件集,Swing组件存放在

javax.swing包中。几乎所有AWT组件对应有新功能更强的Swing组件。另外还加入了一些全新的组件。Swing组件在名称上前面多了一个字母“J”。Swing中所提供的组件集几乎可以替代所有AWT中原有的组件。由此,许多人也

许会产生Swing是AWT的替代物的误解,

而实际上Swing是基于AWT之上创建的。

因此,为了准确的掌握Swing组件集的工作方式,必须首先掌握AWT组件的行为及其

工作原理。9.6.2

Java

AWT中组件与容器基本组件它不能独立地显示出来并且在其内不能再包含其它的组件(如按钮、单选组件等)。容器组件:包含其它基本组件或子容器的组件,并由布局管理器统一决定其内的各个组件的摆放位置和大小(Frame窗框、Dialog对话框、Panel面板、FileDialog文件对话框等)。①

Panel和

Applet是无边框的容器组件②ScrollPanel是具有边框且能处理动的容器组件③Window、Frame、Dialog等都是有边框的容器组件并且可以移动、放大、缩小、关闭等。菜单条式菜单组件:MenuBar菜单条组件、Menu级联菜单组件、MenuItem菜单项组件、CheckboxMenu选择性菜单组件。弹出式菜单组件:,Popupmenu(可以右击或触发其它组件弹出它)。窗

类AWT提供了三个在屏幕上显示窗口的组件:Window、Frame和Dialog。这三个组件都用于显示窗口,而且相互之间的区别也不明显,因此有时候很难确定到底使用哪个组件更好。为了帮助大家区分它们的不同用法,表8.3列出了各组件的属性特征。表9.1

Window、Frame与Dialog组件的属性属性模式化Window不是Frame不是Dialog不是(可设置)可调大小不可可可标题栏无有有边界无有有标题无有有菜单栏无有无焦点管理器有有有警告字符串有有有图表无有无定位到框架可不可可java.awt包简介AWT在java.awt包中提供,表8.1列出了

AWT中的Java软件包。AWT包含四个主要的类:组件类

(Component)、容器类(Container)、图形类

(Graphics)和布局管理器类(LayoutManager和LayoutManager2)。Component(组件)类——菜单、按键、列表等组件的抽象基本类。5.AWT组件类层次组件是构成AWT的基础。 AWT中包括大量的组件,其中大约有一半的类由java.awt.Component类扩展而来,所以,

Component和它所支持的类是AWT的基础。java.awt.Component类是一个抽象类,它为其派生类提供了许多功能。例如,一个组件可以有以下成员:图形对象、位置、尺寸、父容器、前景和背景色、最小/最大和首选尺寸等。图9.1表9.2

Container的子类子类Applet说

明Panel.Applet的扩展,使所有Applet的超类Dialog对话框(可模式化或非模式化Window的扩展)FieldDialog用于选择文件的对话框FrameWindow的扩展,应用程序的容器,可以有菜单和标题栏PanelContainer的扩展,简单的容器ScrollPane滚动组件WindowContainer的扩展,没有菜单或边界,是Frame和Dialog的超类Java

AWT中的各组件的设计方法:1、基本组件的创建:在init()(对Java

Applet而言)或Frame的构造函数内(对Java

Application而言)创建出各个组件对象并初始化其外观、状态等属性;调用容器的add()分别将创建出的各个组件加入到Applet或Frame所在的容器中;然

后注册其事件监听器对象。ButtonDemo.java,CheckboxDemo.java例:

ButtonDemo.javaimport

java.awt.*;

import

java.awt.event.*;public

class

ButtonDemo

extends

Frame

implements

ActionListener{Button

button;public

static

void

main(String[]

args){ButtonDemo

frame

=

new

ButtonDemo();}public

ButtonDemo(){ button

=

new

Button("First");button.addActionListener(this);

add(button);setTitle("Button");setSize(130,

100);setVisible(true);}public

void

actionPerformed(ActionEvent

evt){String

arg

=

evt.getActioncommand();2、容器组件的创建:在init()或Frame的构造函数中内,首先创建出容器组件对象并实例化它,设置布局方式;分别创建出在容器内待包含的各个基本组件并实例化它们;调用容器内的add()函数将各个基本组件加入到容器内;再调用add()将各个子容器加入到Applet中或Frame的主窗框中;然后注册各个基本组件和容器的事件监听器对象;对Frame容器则需要调用setVisible(true)9.6.3窗口(Window)java.awt.Window是三个窗口组件中最基本的组件,它实际上是Frame与Dialog组件的超类。窗口组件没有边界、标题栏与菜单栏,而且大小不可以调整。其次,如果用户在程序设计过程中,需要利用悬浮在其他组件上方的无边界矩形框显示信息,则窗口是最佳选择。常用窗口实现的界面包括:产品信息的封面(如Outlook等软件启动时,显示在屏幕中间且几秒后自动消失的封面窗口),提示帮助信息(如使用金山词霸等软件时,移动鼠标到某个英文单词上时自动弹出的解释信息)等。下面我们通过一个例子来学习如何使用窗口类:例9.2

FrameDemo.javaimport

java.awt.*;public

class

SplashDemo

extends

Frame{ Window

window;static

public

void

main(String[]

args){SplashDemo

frame

=

newSplashDemo();

}public

SplashDemo(){ window

=

new

Window(this);Dimension

scmSize

=Toolkit.getDefaultToolkit().getScreenSi);int

width

=

300;int

height

=

200;window.setLocation(scmSize.width/2-(width/2),scmSize.height/2-(height/2));window.setSize(width,

height);window.show();window.toFront();try

{

Thread.currentThread().sleep(3000catch

(Exception

e)

{e.printStackTrace();}window.dispose();System.exit(0);

}}这是个使用Window的窗口在屏幕上显示一个矩形窗口类的实例,这个窗口没有边界、标题栏与菜单栏,在屏幕上停留3秒后自动消失。如果在窗口中加载一幅图片,则能实现一个类似Outlook的封面窗口程序中用到了工具类的方法

Toolkit.getDefaultToolkit().getScreenSize()。Toolkit类是一个包含许多有用的本地工具方法的类。getScreenSize()方法的作用是取得显示器的像素尺寸。程序的运行结果如图9.2所示。图9.29.6.4框架(Frame)java.awt.Frame是Window的一个子类,它是带有标题栏和边界的窗口,而且允许调整大小。另外,用户还可以为框架附加一个菜单栏。用户在程序设计过程中,当程序窗口需要图表化或者需要包含菜单栏时,则可以选择使用框架组件。构造一个框架后,可以用add()方法来给框架添加组件。框架的缺省布局管理器属性是BorderLayout。可以用setLayout()方式来改变布局管理器属性。框架类中的Frame(String)构造方法创建一个由String规定标题的新的不可见的框架对象。例9.2

FrameDemo.javaimport

java.awt.*;public

class

FrameDemo

extends

Frame{public

FrameDemo(String

title){super(title);}public

static

void

main(String

agrs[])FrameDemo

frame=newFrameDemo("Demo

Frame");{frame.setLocation(100,

100);frame.setSize(500,

200);frame.setVisible(true);

}}程序的运行结果如图8.3所示,它是一个具有标题、大小及背景颜色的框架。图9.39.6.5对话框(Dialog)java.awt.Dialog也是Window的扩展类。与框架相同的是,对话框也拥有边界与标题栏,而且也可以调整大小;而与框架不同的是,对话框不支持附加菜单栏,而且对话框可以模式化属性设置,这是窗口和框架都不允许的。因此,如果用户在程序设计过程中需要创建一个临时窗口与用户交换信息时,使用模式对话框是最方便的。另外,AWT中还提供了Dialog类的一个常用的扩展类——FileDialog(文件对话框)。它可以为用户选择一个待打开或保存的文件。可以说对话框是介于窗口和框架之间的,对话框和框架相比各有特色。我们来看一个典型的对话框的例子。例9.3

DialogDemo.javaimport

java.awt.*;public

class

DialogDemo{public

static

void

main(String

agrs[]){ Frame

frame

=

new

Frame();Dialog

dialog

=

new

Dialog(frame,

"DemoDialog",

false);dialog.setLocation(100,

100);dialog.setSize(500,

100);dialog.setVisible(true);

}}程序运行结果如图9.4所示。图9.4文件对话框是文件选择设备的一个实现。它有自己的自由窗口以及窗口元素,并且允许用户浏览文件系统,以及为以后的操作选择一个特定的文件。例如:例9.4

FileDialogDemo.javaimport

java.awt.*;public

class

FileDialogDemo{ public

static

void

main(String[]

a{ Frame

parentFrame

=

new

Frame();FileDialog

d

=

new

FileDialog(parentFrame,"FileDialog");d.setVisible(true);//

block

here

until

OK

selectedString

fname

=

d.getFile();

}}程序的运行结果如图9.5所示。图9.5通常情况下,并不需要处理

FileDialog的事件。上例中,调用

setVisible(true)将阻塞事件,直至用户选择OK,这时,对话框会请求用户选择文件名,这个信息将作为一个String类型返回。程序的运行结果如图9.6所示。该例为Button注册了一个监听器。任何实现了被注册为监听者的ActionListener接口的类,它的actionPerformed()方法将在一个按钮被鼠标点击“按下”时被调用。按钮被按下时调用的

getActioncommand()方法在缺省情况下将返回触发组件的标签字符串(此处为按键的标签)。我们还可以通过

setActioncommand()方法改变动作命令和标签。复选框(Checkbox)Checkbox组件提供一种简单的“开/关”输入设备,它旁边有一个文本标签。应用方式如下:例:CheckboxDemo.javaimport

java.awt.*;import

java.awt.event.*;public

class

CheckboxDemo

extends

Frameimplements

ItemListener{public

static

void

main(String[]

args){CheckboxDemo

frame

=

new

CheckboxDemo();

}public

CheckboxDemo(){ setTitle("Checkbox

Test");setSize(300,

100);setLayout(new

FlowLayout());Checkbox

one

=

new

Checkbox("One",

true);Checkbox

two

=

new

Checkbox("Two",

false);Checkbox

three

=

new

Checkbox("Three",

true);one.addItemListener(this);two.addItemListener(this);three.addItemListener(this);add(one);add(two);add(three);setVisible(true);}public

void

itemStateChanged(ItemEvent

evt){

String

state

=

"deselected";if

(evt.getStateChange()

==ItemEvent.SELECTED)state

=

"selected";System.out.println(evt.getItem()+""+state)}}程序运行结果如图9.7所示。图9.7选取或不选取(取消)一个复选框的事件将被送往ItemListener接口。所传递的ItemEvent包含

getStateChange()方法,它根据实际情况返回

ItemEvent.DESELECTED或ItemEvent.SELECTED。getItem()方法将受到影响的复选框作为一个表示这个复选框标签的String对象返回。程序中用到了一个布局管理器FlowLayout。

前面我们已经提到了布局管理器的作用,此处为

Frame添加FlowLayout的作用是让包含在其中的组

件顺次排列。关于布局管理器的使用方法在9.5节中还将详细讨论。复选框组—单选框(Checkbox

Group-Radio

Button)复选框组提供了将多个复选框作为一个互斥的集合的方法,因此在任何时

刻,这个集合中只有一个复选框的值是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论