GUI 程式本質是事件驅動:使用者動作 (點擊、輸入) → 系統產生事件 → 程式碼捕獲事件 → 執行回應邏輯。Java 1.0 透過 Event 物件 + handleEvent() 總入口實現此模型。
建立按鈕僅是「放置元件」,必須覆寫事件處理方法 定義點擊後行為。Java 1.0 提供兩條路徑:
action(Event evt, Object arg):處理「標準動作」(按鈕、選單、列表雙擊)handleEvent(Event evt):攔截所有事件 (含滑鼠、鍵盤、焦點)Event 類別裝所有事件類型,靠 id 整數區分evt.target 指向事件來源元件,靠 if (evt.target == btn1) 判斷handleEvent/action 巨大條件鏈中action 第二參數 arg 重複 evt.arg//: Button2.java
public class Button2 extends Applet {
Button b1 = new Button("Button 1"), b2 = new Button("Button 2");
public void init() { add(b1); add(b2); }
public boolean action(Event evt, Object arg) {
if (evt.target.equals(b1)) showStatus("Button 1");
else if (evt.target.equals(b2)) showStatus("Button 2");
else return super.action(evt, arg);
return true;
}
}
public boolean action(Event evt, Object arg) {
if (arg.equals("Button 1")) showStatus("Button 1"); // 依賴標籤文字
else if (arg.equals("Button 2")) showStatus("Button 2");
else return super.action(evt, arg);
return true;
}
嚴重缺陷:大小寫/拼寫錯誤靜默失效、修改標籤文字即破壞邏輯、無編譯期檢查。堅決避免。
evt.target 識別來源元件 (物件身分,非文字)super.action(evt, arg) / super.handleEvent(evt)true,未處理回傳 super... 結果getAppletContext().showStatus() 或直接 showStatus()| 維度 | Java 1.0 | Java 1.1+ |
|---|---|---|
| 事件物件 | 單一 Event 類 | 獨立類別階層 (ActionEvent, MouseEvent...) |
| 處理方式 | 覆寫 handleEvent/action | 實作 Listener 介面 + 註冊 |
| 型別安全 | 無 (靠 id 整數) | 編譯期檢查 |
| 多播支援 | 無 | 單一事件通知多監聽器 |
| 超類鏈陷阱 | 易忘 super 調用 | 框架自動管理 |
| 擴充性 | 差 (修改中央判斷) | 好 (新增監聽器不動既有碼) |
// Java 8+ Lambda 風格
button.addActionListener(e -> showStatus("Button clicked"));
// 或方法參考
button.addActionListener(this::handleButtonClick);
Java 1.0 事件模型 (handleEvent + action + 目標比對) 是歷史包袱:功能有限、極易出錯、難以維護。Java 1.1 委派事件模型 (Listener + addXXXListener) 徹底解決所有痛點,確立了現代 Java 事件處理標準。今日開發者應完全使用監聽器模型,僅在考古極舊代碼時理解 1.0 機制。