Swing 事件模型基於「事件源—監聽器—事件物件」三元架構。本文系統整理 13 種核心監聽器介面、對應事件類別、關鍵方法與觸發情境,為桌面應用開發提供速查參考。
| 監聽器介面 | 核心方法 | 事件類別 | 關鍵事件方法 | 觸發情境 |
|---|---|---|---|---|
ActionListener |
actionPerformed |
ActionEvent |
getActionCommand() 取得命令字串getModifiers() 修飾鍵getWhen() 時間戳 |
按鈕點擊、清單選擇、文字欄位 Enter、計時器到期 |
AdjustmentListener |
adjustmentValueChanged |
AdjustmentEvent |
getAdjustable() 可調整介面getAdjustmentType() 5 種捲動型別getValue() 當前值 |
捲動條操作 |
ItemListener |
itemStateChanged |
ItemEvent |
getItem() 選中元素(需轉型)getItemSelectable() 事件源getStateChange() SELECTED/DESELECTED |
核取方塊、選項按鈕、清單選擇 |
FocusListener |
focusGainedfocusLost |
FocusEvent |
getOppositeComponent() 另一參與元件isTemporary() 暫時/永久轉移 |
元件焦點獲得/失去 |
KeyListener |
keyPressedkeyReleasedkeyTyped |
KeyEvent |
getKeyChar() 字符(僅 keyTyped)getKeyCode() 鍵盤碼getKeyModifiersText() 修飾鍵文字getKeyText() 按鍵名稱 |
鍵盤輸入 |
MouseListener |
mouseClickedmousePressedmouseReleasedmouseEnteredmouseExited |
MouseEvent |
getPoint()/getX()/getY() 相對元件座標getLocationOnScreen() 螢幕絕對座標 (1.6+)getClickCount() 點擊次數getButton() 滑鼠鍵isPopupTrigger() 彈出選單觸發檢查 |
滑鼠點擊、進入/離開元件 |
MouseMotionListener |
mouseDraggedmouseMoved |
MouseEvent |
同 MouseEvent 座標方法 | 滑鼠移動/拖曳 |
MouseWheelListener |
mouseWheelMoved |
MouseWheelEvent |
getScrollType() WHEEL_UNIT/BLOCK_SCROLLgetScrollAmount() 單位捲動量getWheelRotation() 正負值表方向 |
滑鼠滾輪捲動 |
WindowListener |
7 方法:windowOpenedwindowClosingwindowClosedwindowIconifiedwindowDeiconifiedwindowActivatedwindowDeactivated |
WindowEvent |
getWindow() 事件視窗getOppositeWindow() 另一視窗getOldState()/getNewState() 狀態變化 |
視窗開啟/關閉/最小化/啟用/停用 |
WindowFocusListener |
windowGainedFocuswindowLostFocus |
WindowEvent |
同 WindowEvent | 視窗焦點獲得/失去 |
WindowStateListener |
windowStateChanged |
WindowEvent |
getOldState()/getNewState() |
視窗狀態變化(最大化/最小化/常態) |
MouseListener、WindowListener 等),繼承對應 Adapter 類別(如 MouseAdapter、WindowAdapter)僅覆寫需求方法,避免空實作。getActionCommand() 優於文字比對: 為按鈕設定命令字串(setActionCommand),邏輯判斷更穩健。isPopupTrigger() 跨平台一致性: 必須在 mousePressed 與 mouseReleased 皆檢查,因平台觸發時機不同。getPoint() 相對元件;getLocationOnScreen() 相對螢幕(Java 1.6+)。keyPressed → keyTyped → keyReleased;唯有 keyTyped 可取得合成字符(含修飾鍵影響)。button.addActionListener(e -> {
String cmd = e.getActionCommand();
if ("save".equals(cmd)) saveData();
else if ("cancel".equals(cmd)) cancelDialog();
});
frame.addWindowListener(new WindowAdapter() {
@Override public void windowClosing(WindowEvent e) { System.exit(0); }
});
熟練掌握事件模型細節,是構建流暢、健壯 Swing 應用的基石。