3. Applet
3.1 Hello World Applet
接下来使用Applet实现Hello World,借此先了解最简单的Applet程序及使用方法。
1: import java.awt.Graphics;
3: public class HelloWorldApplet extends java.applet.Applet {
4:
5: public void paint(Graphics g) {
6: g.drawString("Hello world!", 5, 25);
7: }
8:}
Applet说明:
(1) 首先Applet一般是从java.applet.Applet中继承过来的;
(2) paint()方法必须是public,不然不能被其它程序正确调用;
(3) 由于paint方法使用了Graphics类,所以Applet需要引用java.awt.
(4) Graphics,当然如果其它的类如果也可以实现Graphics类的功能,也可以引用之;
(5) 在Applet中没有public static void main这个方法,所以它不能独立执行,必须由专门的程序(如游览器)调用执行,Applet程序被调用后,会自动执行paint方法。
这样一个Applet就完成了,以HelloWorldApplet.java文件名保存,使用正常的编译命令编译之,即javac HelloWorldApplet.java,编译完后会生成.class文件,接下来就是在网页中引入之个Applet小程序,这里我们在HTML中引入该Applet小程序:
<html>
<body>
<APPLET code="HelloWorldApplet.class" width=150 height=25></APPLET>
</body>
</html>
(6) 这是一个简单的Applet引用方法,在Html中使用标签APPLET来引用Applet,code属性指定Applet的程序名,在这个例子中引入的Applet与html文件在同一个目录下,所以没加路径说明,如果不是可以使用codebase指定applet所在的路径,路径表示方法与html中的一样;
(7) 其它属性width及时性height是HTML的标准属性
(8) 但是该HTML在游览器中执行时,并不一定能执行Applet小程序。具体原因我还没找到,我使用的操作系统是XP,浏览器是IE6.0,并且已安装了java虚拟机,已经测试过可以正常游览有applet的网站。如果有人知道请不访告诉我(email: 8280338@tzenet.com),大家共同进步。
还有另一个方法可以测试Applet,就是使用appletViewer命令,如果上述的Html文件名为hello.htm,那么可以使用:
appletViewer hello.htm
查看html文件中引入的applet小程序,该命令会忽略html代码,直接执行applet代码。
3.2 Applet参数使用方法
在Applet中可以使用<param>标签向Applet传递参数,如:
<applet ….>
<param NAME=font VALUE="TimesRoman">
……
</applet>
当applet执行时,这些参数就会被传入,可以在init方法中使用getParameter()方法获取这些传入参数的值,如getParameter("font"),该方法返回值始终是String类型的,所以必要的时候还需进行相应的类型转换。如果没有相应的传入参数,那么getParameter()方法会返回null值。
3.3 Applet基本方法
从java.applet.Applet继承过来的applet会有五个基本的方法:
(1) init()方法:当applet被加载时,会首先执行init方法,该方法相当于java application中的main,该方法只能被执行一次;
(2) start()方法:init方法执行完毕会就会自动执行start方法,start方法可以被反复执行,如一个applet被stop后,可以使用start方法重新开动它;
(3) stop()方法:停止执行applet,与start方法相对应
(4) destroy()方法:与init方法相对应;
(5) paint()方法:输出指定内容,paint方法会被反复的调用,在applet初始化时、窗口移动时等;
(6) repaint()方法:该方法调用update方法;
(7) update()方法:该方法清空屏幕的内容后,再调用paint方法重画;paint,repaint及update方法是实现Applet中动画的三个主要函数,一般在update方法中调用g.clipRect方法规则paint的区域,这样paint方法只更新指定区域的内容;
(8) 以上这些方法在必须的时候可以重载,并且不需要在我们的applet中显示的调用,可以自动执行(当然也可以显示调用);
3.4 Applet中的线程
在Applet中如果需要用到动画或者后台数据处理等需要占用大量资源的功能时,最好使用线程。以下是Applet中使用线程的简单例子:
import java.awt.Graphics;
import java.util.Date;
public class DigitalClock extends java.applet.Applet
implements Runnable {
Date theDate; Thread runner;
public void start() {
if (runner == null) {
runner = new Thread(this);
runner.start();
} }
public void stop() {
if (runner != null) {
runner.stop();
runner = null;
} }
public void run() {
while (true) {
theDate = new Date();
repaint();
try { Thread.sleep(1000); }
catch (InterruptedException e) { }
} }
public void paint(Graphics g) {
g.drawString(theDate.toString(),10,50);
}}
说明:
(1) 要在applet支持线程,一般需要实现Runnable接口,所以在本例类的声明中加了implements Runnable;
(2) 在Runable接口中定义了run()方法,当线程start时,会调用这个方法;所以需要实现该方法;
(3) 要使用线程当然需要实例化类Thread(Thread是属于java.lang包):Thread runner = new Thread(this),这里的初始化参数this指定的applet对象;
(4) 接下来在applet的start方法中调用runner.start()方法开始创建线程,线程创建完后,运行run方法;
(5) 在run方法中实现真正要实现的内容,本例修改了theDate的值后,调用repaint方法,该方法的调用触发了paint方法的执行;
(6) 在stop方法中结束线程的运行。