首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 1.0 事件處理替代方案:handleEvent、鍵盤/滑鼠/焦點事件完整對照與自訂按鈕實作

     編輯:Java 相關知識

背景:action() 之外的事件世界

Java 1.0 中,action() 僅處理「標準動作」(按鈕點擊、選單選擇等)。若需捕捉鍵盤、滑鼠移動、焦點變化,必須覆寫 Component 定義的特定事件方法。

元件事件方法完整對照表

方法簽名觸發時機備註
action(Event evt, Object what)標準動作 (按鈕、選單、列表雙擊等)第二參數為冗餘的 evt.arg
keyDown(Event evt, int key)按鍵按下且元件擁有焦點key 為按鍵碼,冗餘自 evt.key
keyUp(Event evt, int key)按鍵釋放且元件擁有焦點
lostFocus(Event evt, Object what)焦點離開元件what 冗餘自 evt.arg
gotFocus(Event evt, Object what)焦點進入元件
mouseDown(Event evt, int x, int y)滑鼠按下在元件上座標相對元件原點
mouseUp(Event evt, int x, int y)滑鼠釋放在元件上
mouseMove(Event evt, int x, int y)滑鼠在元件上移動 (未按下)
mouseDrag(Event evt, int x, int y)按下後拖曳所有拖曳事件回報給最初按下的元件
mouseEnter(Event evt, int x, int y)滑鼠進入元件區域
mouseExit(Event evt, int x, int y)滑鼠離開元件區域

注意:所有額外參數 (key, x, y, what) 皆冗餘包含於 Event 物件中,Java 為了某些語言互操作性保留此設計。

自訂按鈕元件實作:MyButton

繼承 Canvas 而非 Button,因 Button 為重量級原生元件,無法自訂繪圖與事件處理。

class MyButton extends Canvas {
    AutoEvent parent; Color color; String label;
    MyButton(AutoEvent parent, Color color, String label) { ... }

    public void paint(Graphics g) {
        g.setColor(color);
        g.fillRoundRect(0, 0, size().width, size().height, 30, 30);
        g.setColor(Color.black);
        g.drawRoundRect(0, 0, size().width, size().height, 30, 30);
        // 字體度量置中繪製 label...
    }

    // 覆寫所有滑鼠/鍵盤/焦點事件,轉發給父視窗的 Hashtable 管理的 TextField 顯示
    public boolean keyDown(Event evt, int key) { updateField("keyDown", evt); return true; }
    public boolean keyUp(Event evt, int key) { updateField("keyUp", evt); return true; }
    // ... lostFocus, gotFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp
}

事件展示主程式:AutoEvent

public class AutoEvent extends Applet {
    Hashtable h = new Hashtable();
    String[] events = {"keyDown","keyUp","lostFocus","gotFocus",
                       "mouseDown","mouseUp","mouseMove","mouseDrag",
                       "mouseEnter","mouseExit"};
    MyButton b1 = new MyButton(this, Color.blue, "test1"),
             b2 = new MyButton(this, Color.red, "test2");

    public void init() {
        setLayout(new GridLayout(events.length+1, 2));
        for (String ev : events) {
            TextField t = new TextField(); t.setEditable(false);
            add(new Label(ev, Label.CENTER)); add(t);
            h.put(ev, t);
        }
        add(b1); add(b2);
    }
}

關鍵設計觀察

  1. 高度耦合:MyButton 直接依賴 AutoEvent 的 Hashtable 結構,難以重用。
  2. Canvas vs Button:輕量級 Canvas 允許完整控制繪圖與事件;重量級 Button 繪圖由原生同級處理,不可干涉。
  3. 字體度量置中算法:FontMetrics 計算水平/垂直置中座標,為自訂元件繪圖基礎技能。
  4. 事件冗餘參數:Java 1.0 設計保留冗餘參數,1.1 事件模型移除此設計,改由事件物件封裝所有資訊。

Java 1.1+ 現代化對應

1.0 事件方法1.1+ 監聽器介面適配器
keyDown/keyUpKeyListener (keyPressed/Released/Typed)KeyAdapter
lostFocus/gotFocusFocusListener (focusLost/Gained)FocusAdapter
mouseDown/Up/Move/Drag/Enter/ExitMouseListener + MouseMotionListenerMouseAdapter + MouseMotionAdapter
actionActionListener (actionPerformed)無 (單一方法)

最佳實踐總結

  • Java 1.0 事件模型已淘汰,僅供維護舊代碼參考。
  • 新代碼務必使用 1.1+ 委派事件模型:型別安全、擴充性強、支援多播。
  • 自訂元件繼承 JComponent (Swing) 或 Canvas (AWT) / Region (JavaFX),覆寫 paintComponent/paint。
  • 事件處理邏輯與元件繪圖分離,避免 MyButton 式高度耦合設計。
  • 善用 @Override 註解防止方法簽名拼寫錯誤導致無效覆寫。

理解舊事件模型有助於閱讀歷史代碼,但實務開發請完全擁抱現代事件架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved