电脑技术学习

具有 Applet - Application 双重身份的类

dn001
内容: 作者: 边城狂人 (2002-4-2)
出处: 边城客栈

--------------------------------------------

  Applet(小应用程序) 就用于网页中,美化和丰富网页的内容,由浏览器管理其生命周期(Life Cycle), 即生成(new)、初始化(init)、运行(start)、停止(stop)和销毁(destroy)等。写 applet,必须从 java.applet.Applet 类继承,并根据需要重载 init()(applet 被读入系统时由浏览器调用,只调用一次,初始化 appet), start()(浏览器运行 applet 时调用), stop()(浏览器停止 applet 时调用), destroy()(applet 被销毁时调用,在这里释放一些需要释放的资源) 等方法。如下例是一个简单的、什么都不做的 applet:

/**
* @(#) MyApplet.java
* @author fancy
*/

import java.applet.*;

public class MyApplet extends Applet { // ! 必须从 java.applet.Applet 继承 !
}
  Application(应用程序) 是能使用 java 命令运行的 java 应用程序,它以一个特定的 main() 方法为入口,自行管理其生命周期。写一个 application 则必须要实现上述特定的 main() 方法。该 main() 方法必须是 public(公有)、static(静态)、void(无返回值) 的,而且必须要求一个 String[] 类型的参数。如下例是一个简单的,什么都不做的 application:

/**
* @(#) MyApplication.java
* @author fancy
*/

public class MyApplication {

public static void main(String[] args) { // ! 必须要有一个 pulic static void main(String[]) 方法 !
}

}
  简单的介绍过 applet 和 application 的要点之后,下面我们要进入主题了??写一个类,它即是 applet 又是 application。

  根据上述 applet 和 application 的特点和要求,这个类必须从 java.applet.Applet 继承,且实现了 public static void main(String[]) 方法,如下例,它同样什么都不做:

/**
* @(#) MyAppletApplication.java
* @author fancy
*/

import java.applet.*;

public class MyAppletApplication extends Applet { // ! ① 从 java.applet.Applet 继承 !

public static void main(String[] args) { // ! ② 实现了 public static void main(String[]) 方法 !
}

}
  上面说的各类都是什么都不做的,如果要做什么又该怎么办呢?

  由于 applet 是浏览器管理其生命周期,即由浏览器生成 applet 实例和调用它从 java.applet.Applet 类继承的 init()、start()、stop() 和 destroy() 等方法;而 application 是由自己管理生命周期,需要自己生成实例并调用相关方法。所以我们的 MyAppletApplication 类必须根据需要实现 init()、start()、stop() 和 destroy() 等方法,以便浏览器对其生命周期进行管理;同时,也必须在那个特定的 main() 方法中生成该类的实例(对象),并调用用于管理期生命周期的相关方法。如

/**
* @(#) MyAppletApplication.java
* @author fancy
*/

import java.applet.*;

public class MyAppletApplication extends Applet {

public static void main(String[] args) {
MyAppletApplication app = new yAppletApplication(); // ①生成实例
......
app.init(); // ② 初始化
......
app.start(); // ③ 开始运行
......
app.stop(); // ④ 停止运行
......
app.destroy(); // ⑤ 销毁
......
}

}
  其实做到这些还是不够的,因为一个 applet 放入网页中,就由浏览器负责对其进行绘制(显示),而在应用程序中,则需要我们使用相关部件对其进行绘制。值得庆幸的是,java.applet.Applet 从 java.awt.Componnet 继承,它就是一个 AWT 部件(Component),我们只需要将它加入到一个 Frame 或者 Window 中即可实现对它的绘制。至此,所有的问题都已经解决了,请看下例:

/**
* @(#) MyAppletApplication.java
* @author fancy
*/

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class MyAppletApplication extends Applet { // 从 java.applet.Applet 继承

private List list;

public void init() { // 初始化
list = new List();
add(list);
list.addItem("Initializing");
System.out.println("Initializing");
}

public void start() { // 开始运行时
list.addItem("Starting");
System.out.println("Starting");
}

public void stop() { // 结束运行时
list.addItem("Stopping"); // 这句看不到效果
System.out.println("Stopping");
}

public void destroy() { // 销毁时
list.addItem("Destroying"); // 这句看不到效果
System.out.println("Destroying");
}

public static void main(String[] args) {
MyAppletApplication app = new MyAppletApplication();
app.init();
app.start();
Frame frame = new Frame();
frame.add(app);
frame.addWindowListener(new MyWindowListener(app));
frame.setSize(200, 150);
frame.show();
}

public static class MyWindowListener extends WindowAdapter {

Applet applet;

public MyWindowListener(Applet applet) {
this.applet = applet;
}

public void windowClosing(WindowEvent event) {
applet.stop();
applet.destroy();
System.exit(0);
}

}

}
  备注:上例中,在 stop() 和 destroy() 中为 list 添加项是看不到效果的,因为此时 applet 已经停止或者正在销毁,它作为 application 身份时也一样。另外,所有的 System.out.println() 语句在上例作为 applet 时也是看不到的。

注意:并不是所有的小应用程序都可能同时也是应用程序,因为有一些在小应用程序中的功能不能用于应用程序中,如 Applet.getCodeBase()、Applet.getDocumentBase() 等在 Application 中应用时就会抛异常。而一些在 Application 中可以使用的内容,由于安全问题,也不能在 Applet 中使用,毕竟 Applet 是要发布在网上的,需要更高的安全性。
Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd

标签: