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

Java AWT 事件與監聽器完整對照表:元件支援事件、監聽器介面與適配器模式全解析

     編輯:Java 相關知識

前言

Java 1.1 委派事件模型中,每個元件透過 addXXXListener()/removeXXXListener() 註冊特定事件監聽器。本文提供三張核心對照表:事件→監聽器→支援元件、元件→支援事件、監聽器介面→必須實作方法,並深入解析適配器模式簡化多方法介面實作。

表一:事件、監聽器介面與支援元件

事件 / 監聽器 / 註冊方法支援元件
ActionEvent / ActionListener
add/removeActionListener()
Button, List, TextField, MenuItem, CheckboxMenuItem, Menu, PopupMenu
AdjustmentEvent / AdjustmentListener
add/removeAdjustmentListener()
Scrollbar, 實作 Adjustable 介面的自訂元件
ComponentEvent / ComponentListener
add/removeComponentListener()
所有 Component 子類:Button, Canvas, Checkbox, Choice, Container, Panel, Applet, ScrollPane, Window, Dialog, FileDialog, Frame, Label, List, Scrollbar, TextArea, TextField
ContainerEvent / ContainerListener
add/removeContainerListener()
Container 子類:Panel, Applet, ScrollPane, Window, Dialog, FileDialog, Frame
FocusEvent / FocusListener
add/removeFocusListener()
所有 Component 子類 (同上)
KeyEvent / KeyListener
add/removeKeyListener()
所有 Component 子類 (同上)
MouseEvent / MouseListener
add/removeMouseListener()
所有 Component 子類 (同上)
MouseEvent / MouseMotionListener
add/removeMouseMotionListener()
所有 Component 子類 (同上)
WindowEvent / WindowListener
add/removeWindowListener()
Window 子類:Dialog, FileDialog, Frame
ItemEvent / ItemListener
add/removeItemListener()
Checkbox, CheckboxMenuItem, Choice, List, 實作 ItemSelectable 介面的元件
TextEvent / TextListener
add/removeTextListener()
TextComponent 子類:TextArea, TextField

註:MouseEvent 同時用於點擊與移動,無獨立 MouseMotionEvent。

表二:元件類型與支援事件

元件類型支援事件
AdjustableAdjustmentEvent
AppletContainerEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
ButtonActionEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
CanvasFocusEvent, KeyEvent, MouseEvent, ComponentEvent
CheckboxItemEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
CheckboxMenuItemActionEvent, ItemEvent
ChoiceItemEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
ComponentFocusEvent, KeyEvent, MouseEvent, ComponentEvent
ContainerContainerEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
DialogContainerEvent, WindowEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
FileDialogContainerEvent, WindowEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
FrameContainerEvent, WindowEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
LabelFocusEvent, KeyEvent, MouseEvent, ComponentEvent
ListActionEvent, FocusEvent, KeyEvent, MouseEvent, ItemEvent, ComponentEvent
MenuActionEvent
MenuItemActionEvent
PanelContainerEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
PopupMenuActionEvent
ScrollbarAdjustmentEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
ScrollPaneContainerEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
TextAreaTextEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
TextComponentTextEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
TextFieldActionEvent, TextEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent
WindowContainerEvent, WindowEvent, FocusEvent, KeyEvent, MouseEvent, ComponentEvent

表三:監聽器介面與必須實作方法

監聽器介面 (適配器)介面方法
ActionListeneractionPerformed(ActionEvent)
AdjustmentListeneradjustmentValueChanged(AdjustmentEvent)
ComponentListener (ComponentAdapter)componentHidden/Shown/Moved/Resized(ComponentEvent)
ContainerListener (ContainerAdapter)componentAdded/Removed(ContainerEvent)
FocusListener (FocusAdapter)focusGained/Lost(FocusEvent)
KeyListener (KeyAdapter)keyPressed/Released/Typed(KeyEvent)
MouseListener (MouseAdapter)mouseClicked/Entered/Exited/Pressed/Released(MouseEvent)
MouseMotionListener (MouseMotionAdapter)mouseDragged/Moved(MouseEvent)
WindowListener (WindowAdapter)windowOpened/Closing/Closed/Activated/Deactivated/Iconified/Deiconified(WindowEvent)
ItemListeneritemStateChanged(ItemEvent)
TextListenertextValueChanged(TextEvent)

三步驟快速掌握事件處理

  1. 找介面:事件類名去掉 "Event" + "Listener" (如 MouseEvent → MouseListener)
  2. 寫方法:實作介面中關注的方法 (如 mouseMoved())
  3. 註冊:元件呼叫 add + 介面名 (如 addMouseMotionListener())

適配器模式:簡化多方法介面實作

單方法介面 (ActionListener, ItemListener, TextListener, AdjustmentListener) 直接實作即可。多方法介面若逐一實作空方法極繁瑣,Java 提供 適配器類別 (Adapter) 供繼承覆寫:

// 典型視窗關閉處理
class MyWindowListener extends WindowAdapter {
    public void windowClosing(WindowEvent e) { System.exit(0); }
}

WindowAdapter 已提供所有方法的空實作,僅覆寫關心的 windowClosing() 即可。

適配器陷阱:大小寫拼錯 = 新方法而非覆寫

// 錯誤:WindowClosing (大寫 W) → 新方法,非覆寫
class MyWindowListener extends WindowAdapter {
    public void WindowClosing(WindowEvent e) { System.exit(0); } // 無效!
}

編譯通過、執行無誤,但關閉視窗不退出程式。@Override 註解 (Java 5+) 可編譯期攔截此類錯誤,強烈建議永遠加上。

現代化延伸

  • Swing 繼承相同模型,新增 EventListenerList 高效管理監聽器。
  • JavaFX 採用 EventHandler<T> 函數式介面 + Lambda,更簡潔。
  • Spring 事件機制 (ApplicationEventPublisher) 實現業務層解耦事件驅動。

熟記此對照表,除錯「為什麼我的監聽器不觸發」將從猜謎變成查表驗證。

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