2023年11月25日发(作者:)

JavaApplet编程和实例

Java最初奉献给世⼈的就是Applet,随即它吸引了全世界的⽬光,Applet运⾏于浏览器上,可以⽣成⽣动美丽的页⾯,进⾏友好的⼈机交

互,同时还能处理图像、声⾳、动画等多媒体数据。Applet在Java的成长过程中起到不可估量的作⽤,到今天Applet依然是Java程序设计

最吸引的⼈之⼀。在本期专题中我将向读者介绍Applet编程的⼀些技巧。

Java Applet 是⽤Java 语⾔编写的⼀些⼩应⽤程序,这些程序是直接嵌⼊到页⾯中,由⽀持Java的浏览器(IE 或 Nescape)解释执⾏能

够产⽣特殊效果的程序。它可以⼤⼤提⾼Web页⾯的交互能⼒和动态执⾏能⼒。包含Applet的⽹页被称为Java-powered页,可以称其为

Java⽀持的⽹页。

当⽤户访问这样的⽹页时,Applet被下载到⽤户的计算机上执⾏,但前提是⽤户使⽤的是⽀持Java的⽹络浏览器。由于Applet是在⽤户的

{

ring("Hello World!",5,35)

}

}

保存上述程序在C:/ghq/⽂件⾥。

(2)编译Applet

编译源⽂件可使⽤如下JDK命令:

C:/ghq/javac Enter

注意:如果编写的源程序违反了Java编程语⾔的语法规则,Java编译器将在屏幕上显⽰语法错误提⽰信息。源⽂件中必须不含任何语

法错误,Java编译器才能成功地把源程序转换为appletviewer和浏览器能够执⾏的字节码程序。

成功地编译Java applet之后⽣成响应的字节码⽂件的⽂件。⽤资源管理器或DIR命令列出⽬录列表,将会发现⽬录

C:/ghq中多了⼀个名为的⽂件。

(3)创建HTML⽂件

在运⾏创建的 之前,还需创建⼀个HTML⽂件,appletviewer或浏览器将通过该⽂件访问创建的Applet。为运⾏

, 需要创建包含如下HTML语句的名为的⽂件。

HTML

TITLEHelloWorld! Applet/TITLE

APPLET

CODE=""

WIDTH=200

}

Applet类的构造函数只有⼀种,即:public Applet()

Applet实现了很多基本的⽅法,下⾯列出了Applet类中常⽤⽅法和⽤途。

public final void setStub(AppletStub stub)

//设置AppletJavaC之间转换参数并返回值的代码位,它是由系统⾃动设定的。

public boolean isActive();// 判断⼀个Applet是否处于活动状态。

public URL getDocumentBase();// 检索表⽰该Applet运⾏的⽂件⽬录的对象。

public URL getCodeBase();// 获取该Applet 代码的URL地址。

public String getParameter(String name)// 获取该Applet name指定参数的值。

public AppletContext getAppletContext()// 返回浏览器或⼩应⽤程序观察器。

public void resize(int width,int height)// 调整Applet运⾏的窗⼝尺⼨。

public void resize(Dimension d)// 调整Applet运⾏的窗⼝尺⼨。

public void showStatus(String msg)// 在浏览器的状态条中显⽰指定的信息。

public Image getImage(URL url) // url指定的地址装⼊图象。

public Image getImage(URL url,String name)// url指定的地址和⽂件名加载图像。

public AudioClip getAudioClip(URL url)// url指定的地址获取声⾳⽂件。

public AudioClip getAudioClip(URL url, String name)// url指定的地址和⽂件名获取声⾳。

public String getAppletInfo()// 返回Applet应⽤有关的作者、版本和版权⽅⾯的信息;

public String[][] getParameterInfo()

// 返回描述Applet参数的字符串数组,该数组通常包含三个字符串: 参数名、该参数所需值的类型和该参数的说明。

public void play(URL url)// 加载并播放⼀个url指定的⾳频剪辑。

public void destroy()//撤消Applet及其所占⽤的资源。若该Applet是活动的,则先终⽌该Applet的运⾏。

(1) Applet运⾏状态控制基本⽅法

Applet类中的四种基本⽅法⽤来控制其运⾏状态:init()、start()、stop()、destroy()

init()⽅法

这个⽅法主要是为Applet的正常运⾏做⼀些初始化⼯作。当⼀个Applet被系统调⽤时,系统⾸先调⽤的就是该⽅法。通常可以在该⽅

法中完成从⽹页向Applet传递参数,添加⽤户界⾯的基本组件等操作。

start()⽅法

系统在调⽤完init()⽅法之后,将⾃动调⽤start()⽅法。⽽且,每当⽤户离开包含该Applet的主页后⼜再返回时,系统⼜会再执⾏⼀遍

start()⽅法。这就意味着start()⽅法可以被多次执⾏,⽽不像init()⽅法。因此,可把只希望执⾏⼀遍的代码放在init()⽅法中。可以在

start()⽅法中开始⼀个线程,如继续⼀个动画、声⾳等。

stop()⽅法

这个⽅法在⽤户离开Applet所在页⾯时执⾏,因此,它也是可以被多次执⾏的。它使你可以在⽤户并不注意Applet的时候,停⽌⼀些

耗⽤系统资源的⼯作以免影响系统的运⾏速度,且并不需要⼈为地去调⽤该⽅法。如果Applet中不包含动画、声⾳等程序,通常也不必实现

该⽅法。

destroy()⽅法

与对象的finalize()⽅法不同,Java在浏览器关闭的时候才调⽤该⽅法。Applet是嵌在HTML⽂件中的,所以destroty()⽅法不关⼼何

时Applet被关闭,它在浏览器关闭的时候⾃动执⾏。在destroy()⽅法中⼀般可以要求收回占⽤的⾮内存独⽴资源。(如果在Applet仍在运⾏

时浏览器被关闭,系统将先执⾏stop()⽅法,再执⾏destroy()⽅法。

(2) Applet应⽤的有关参数说明

利⽤Applet来接收从HTML中传递过来的参数,下⾯对这些参数作⼀简单说明:

* CODE标志

* CODE标志

显⽰⽂字是Java中最基本的功能,使⽤⾮常简单的⽅式来⽀持⽂字的显⽰,只要使⽤类Graphics中的drawString()函数就能实现。我们来

看最简单的ghq例⼦:

//

import .*;

import .*;

public class ghq extends Applet

{

String text="ghq is a student!";

public void paint(Graphics g)

{

ring(text,20,20);

} //在坐标20,20 处显⽰text的内容

}

这是最基本的Java Applet,运⾏的时候仅显⽰“ghq is a student!”。Java⽀持Unicode,因此中⽂也能在Java中很好地显⽰出

我们再来看对键盘响应的例⼦:

//

import .*;

import .*;

public class Keyboard extends Applet

{

String text="";

public void paint(Graphics g)

{

显⽰图像()

//源程序清单

import .*;

import .*;

public class ShowImage extends Applet

Image picure; //定义类型为Image的成员变量

public void init()

{

picture=getImage(getCodeBase(),""); //装载图像

}

public void paint(Graphics g)

{

age(picture,0,0,this); //显⽰图像

}

}

为此,HTML⽂件中有关Applet的语句如下:

HTML

TITLEShow Image Applet/TITLE

APPLET

CODE="" //class⽂件名为

WIDTH=600

HEIGHT=400

/APPLET

/HTML

编译之后运⾏该Applet时,图像不是⼀⽓呵成的。这是因为程序不是drawImage⽅法返回之前把图像完整地装⼊并显⽰的。与此相

反,drawImage⽅法创建了⼀个线程,该线程与Applet的原有执⾏线程并发执⾏,它⼀边装⼊⼀边显⽰,从⽽产⽣了这种不连续现象。为

了提⾼显⽰效果。许多Applet都采⽤图像双缓冲技术,即先把图像完整地装⼊内存然后再显⽰在屏幕上,这样可使图像的显⽰⼀⽓呵成。

双缓冲图像

为了提⾼图像的显⽰效果应采⽤双缓冲技术。⾸先把图像装⼊内存,然后再显⽰在Applet窗⼝中。

使⽤双缓冲图像技术例⼦()

//源程序清单

import .*;

import java. applet.*;

public class BackgroundImage extends Applet //继承Applet

{

age(picture,0,0,null); //显⽰图像,第四参数为null,不是this

showStatus("Done");

}

else

showStatus("Loading image");

}

public boolean imageUpdate(Image img,int infoflags,int x,int y,int w,int h)

{

[⽂章导读]使⽤Applet播放声⾳时需⾸先定义AudioClip对象,GetAudioClip⽅法能把声⾳赋予AudioClip对象使⽤Applet播放声⾳时需⾸

先定义AudioClip对象,GetAudioClip⽅法能把声⾳赋予AudioClip对象,如果仅想把声⾳播放⼀遍,应调⽤AudioClip类的play⽅法,如

果想循环把声⾳剪辑,应选⽤AudioClip类的loop⽅法。

(1) 播放声⾳⽂件

图像格式各种各样,如BMP、GIF和JPEG等。声⾳⽂件也⼀样,WAV和AU是最常⽤的两种声⾳⽂件。⽬前Java仅⽀持AU⽂件,但

Windows环境下常⽤的却是WAV⽂件,所以最好能有⼀个可把WAV⽂件转换为AU⽂件的⼯具。

* 播放声⾳的AudioClip类

AudioClip类⽤来在Java Applet内播放声⾳,该类在包中有定义。

下⾯演⽰了如何利⽤AudioClip类播放声⾳。

装⼊⼀个名为的声⾳⽂件并播放()

//源程序清单

import .*;

import .*

public class SoundDemo extends Applet

{

public void paint(Graphics g)

{

AudioClip audioClip=getAudioClip(getCodeBase(),””);

//创建AudioClip对象并⽤//getAudioClip⽅法将其初始化。

ring("Sound Demo! ",5,15);

()//使⽤AudioClip类的loop⽅法循环播放

}

}

[⽂章导读]在Java中实现动画有很多种办法,但它们实现的基本原理是⼀样的,即在屏幕上画出⼀系列的帧来造成运动的感觉

Java 不仅提供了对图形、图像的⽀持,还允许⽤户实现连续的图像播放,即动画技术。Java 动画的实现,⾸先⽤ 包中的

Graphics 类的drawImage()⽅法在屏幕上画出图像,然后通过定义⼀个线程,让该线程睡眠⼀段时间,然后再切换成另外⼀幅图像;如此

循环,在屏幕上画出⼀系列的帧来造成运动的感觉,从⽽达到显⽰动画的⽬的。

为了每秒钟多次更新屏幕,必须创建⼀个线程来实现动画的循环,这个循环要跟踪当前帧并响应周期性的屏幕更新要求;实现线程的⽅法有

两种,可以创建⼀个类Thread 的派⽣类,或附和在⼀个Runnable 的界⾯上。

* 动画技巧

在编写动画过程时,遇到最常见的问题是屏幕会出现闪烁现象。闪烁有两个原因:⼀是绘制每⼀帧花费的时间太长(因为重绘时要求的

String lastdate; // 保存当前时间的字符串

Font clockFaceFont; //设置显⽰时钟⾥⾯的数字的字体

Date currentDate; // 显⽰当前时间

Color handColor; // ⽤于显⽰时针、分针和表盘的颜⾊

Color numberColor; // ⽤于显⽰秒针和数字的颜⾊

public void init()

{

int x,y;

lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0;

formatter = new SimpleDateFormat ("yyyy EEE MMM dd hh:mm:ss ");

currentDate = new Date();

lastdate = (currentDate);

clockFaceFont = new Font("Serif", , 14);

handColor = ;

numberColor = ay;

try {

setBackground(new Color(nt(getParameter("bgcolor"),16)));

} catch (Exception E) { }

try {

handColor = new Color(nt(getParameter("fgcolor1"),16));

}

else {

d=d+2*(x-y)+5;

x++;

y--;

}

plotpoints(x0,y0,x,y,g);

}

}

public void paint(Graphics g)

{

or(numberColor);

ring("9",xcenter-45,ycenter+3);

ring("3",xcenter+40,ycenter+3);

ring("12",xcenter-5,ycenter-37);

ring("6",xcenter-3,ycenter+45);

// 如果必要的话抹去然后重画

or(getBackground());

if (xs != lastxs || ys != lastys) {

ne(xcenter, ycenter, lastxs, lastys);

ring(lastdate, 5, 125);

}

}

//注意:这⾥重写了update()⽅法,只是调⽤了paint()⽅法来消除闪烁现象

public void update(Graphics g)

{

paint(g);

}

}

下⾯是运⾏该Applet 需要的 的内容

HTML

HEAD

TITLE>⼀个时钟的例⼦</TITLE

/HEAD

BODY

hr

applet codebase="." ALIGN=MIDDLE code="" width=200 height=150

/applet

/BODY

/HTML

[⽂章导读]在有些情况下,可能需要在发⽣某事件时伴之以声⾳,⼪其是在Applet 中装载图像的同时播放声⾳,这样将⼤⼤地丰富Applet

内容

在有些情况下,可能需要在发⽣某事件时伴之以声⾳,⼪其是在Applet 中装载图像的同时播放声⾳,这样将⼤⼤地丰富Applet的内容。协调

使⽤图像的声⾳是⼗分重要的。

声⾳和图像的协调()

//源程序清单

import .*;

import .*;

import .*;

public class Appletl extends Applet implements Runnable

{

AudioClip audioClip;

Thread ShapeThread=null;

Random RandomNumber=new Random( );

Color ImageColor;

public void init( )

{

audioClip=getAudioClip(getCodeBase( ), "");// 创建⼀个AudioClip对象

}

case 0: ImageColor=;

break;

case 1: ImageColor=;

break;

case 2: ImageColor=;

break;

case3: ImageColor=a;

break;

case4: ImageColor=;

break;

default: ImageColor=;

}

try

{

(300); //线程睡眠

}

catch(InterruptedException e)

{

//忽略异常

repaint();

}

}

public void paint(Graphics g)

{

or(ImageColor);

(); //播放声⾳

switch(t(2)) //获取随机数与2整除的余数

{

case0:ct(25,25,200,200); //添充⼀个矩形

break;

default:al(25,25,200,200); //添充⼀个椭圆

break;

}

}

}

Applet的声⾳处理⾮常简单。它⾸先创建⼀个AudioClip对象并⽤getAudioClip把声⾳⽂件赋予该对象,然后⽤AudioClip类的play

法播放声⾳。该Applet使⽤Random对象产⽣随机数。它⾸先根据随机数确定颜⾊;然后在paint内根据随机数确定画圆还是画⽅。Random

类的nexsInt函数返回⼀个随机整数(int)。该Applet把随机数转换为⼀个0~4之间的值(run函数内)和⼀个0~1之间的值(paint函数内)

需把如下的HTML语句放⼊⽂件,为运⾏该Appletl做准备。

HTML

TITLEApplet/TITLE

APPLET CODE="" WIDTH=300 HEIGHT=300

/APPLET

/HTML

编译并运⾏该Appletl,屏幕上将显⽰出⼀个Applet窗⼝,窗⼝中不