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 為了某些語言互操作性保留此設計。
繼承 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
}
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);
}
}
MyButton 直接依賴 AutoEvent 的 Hashtable 結構,難以重用。Canvas 允許完整控制繪圖與事件;重量級 Button 繪圖由原生同級處理,不可干涉。FontMetrics 計算水平/垂直置中座標,為自訂元件繪圖基礎技能。| 1.0 事件方法 | 1.1+ 監聽器介面 | 適配器 |
|---|---|---|
| keyDown/keyUp | KeyListener (keyPressed/Released/Typed) | KeyAdapter |
| lostFocus/gotFocus | FocusListener (focusLost/Gained) | FocusAdapter |
| mouseDown/Up/Move/Drag/Enter/Exit | MouseListener + MouseMotionListener | MouseAdapter + MouseMotionAdapter |
| action | ActionListener (actionPerformed) | 無 (單一方法) |
JComponent (Swing) 或 Canvas (AWT) / Region (JavaFX),覆寫 paintComponent/paint。MyButton 式高度耦合設計。@Override 註解防止方法簽名拼寫錯誤導致無效覆寫。理解舊事件模型有助於閱讀歷史代碼,但實務開發請完全擁抱現代事件架構。