具有 Applet & Application 雙重身份的類 (轉)

amyz發表於2007-10-17
具有 Applet & Application 雙重身份的類 (轉)[@more@]

  Applet(小應用) 就用於網頁中,美化和豐富網頁的內容,由管理其生命週期(Life Cycle), 即生成(new)、初始化(init)、執行(start)、停止(stop)和銷燬(destroy)等。寫 applet,必須從 .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.Compo 繼承,它就是一個 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("Stop"); // 這句看不到效果 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 是要釋出在網上的,需要更高的安全性。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-977214/,如需轉載,請註明出處,否則將追究法律責任。

相關文章