只需在 Applet 類別加入 main(),建立 Frame 載入 Applet 實例,即可同時支援瀏覽器嵌入與獨立應用程式啟動。
//: Button2NewB.java
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Button2NewB extends Applet {
Button b1 = new Button("Button 1"), b2 = new Button("Button 2");
TextField t = new TextField(20);
public void init() {
b1.addActionListener(new B1());
b2.addActionListener(new B2());
add(b1); add(b2); add(t);
}
class B1 implements ActionListener { public void actionPerformed(ActionEvent e) { t.setText("Button 1"); } }
class B2 implements ActionListener { public void actionPerformed(ActionEvent e) { t.setText("Button 2"); } }
// 視窗關閉處理:靜態內部類避免外部實例參考
static class WL extends WindowAdapter {
public void windowClosing(WindowEvent e) { System.exit(0); }
}
public static void main(String[] args) {
Button2NewB applet = new Button2NewB();
Frame aFrame = new Frame("Button2NewB");
aFrame.addWindowListener(new WL());
aFrame.add(applet, BorderLayout.CENTER);
aFrame.setSize(300, 200);
applet.init(); applet.start(); // 手動觸發生命週期
aFrame.setVisible(true); // Java 1.1 取代 show()
}
} ///:~
// 取代獨立 WL 類別
aFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { System.exit(0); }
});
優點:減少類別名稱汙染;缺點:過度使用可能降低可讀性,視團隊風格決定。
// 舊寫法:字串易拼錯、編譯不檢查
aFrame.add(applet, "Center");
// 新寫法:編譯期檢查
aFrame.add(applet, BorderLayout.CENTER);
這是 Java Beans 命名規範的先聲,所有標準元件皆支援常數定位。
// 打包所有 .class (含內部類別)
jar cf Button2NewB.jar *.class
// HTML 引用
<applet code="Button2NewB.class" archive="Button2NewB.jar" width=200 height=150></applet>
優勢:
手動呼叫 init()/start() 覆蓋瀏覽器自動行為。若需完整模擬,可在 windowClosing 中補充:
public void windowClosing(WindowEvent e) {
applet.stop();
applet.destroy();
System.exit(0);
}
setVisible(true) 取代 show()、常數取代魔術字串,體現 API 向型別安全、可發現性演進。掌握此範本,不僅理解歷史技術,更能體會「啟動入口統一、配置外部化、依賴注入友善」的現代架構精髓。