Java 圖形界面(AWT/Swing)採用委派事件模型:事件源(組件)產生事件,監聽器(Listener)處理事件。本文介紹事件分類、監聽器接口、註冊機制、匿名類實現、適配器模式簡化編碼。
ActionEvent, MouseEvent, KeyEvent 等),繼承自 java.util.EventObject。ActionListener, MouseListener 等)的對象,包含事件處理方法。button.addActionListener(listener))。| 事件類 | 監聽器接口 | 典型組件 | 觸發動作 |
|---|---|---|---|
| ActionEvent | ActionListener | Button, MenuItem, TextField | 點擊、按回車 |
| MouseEvent | MouseListener, MouseMotionListener | 所有 Component | 點擊、進出、拖拽、移動 |
| KeyEvent | KeyListener | 可聚焦組件 | 鍵盤按下、釋放、輸入 |
| FocusEvent | FocusListener | 所有 Component | 獲得/失去焦點 |
| WindowEvent | WindowListener | Window, Frame, Dialog | 打開、關閉、圖標化 |
| AdjustmentEvent | AdjustmentListener | Scrollbar | 滾動條調整 |
| ItemEvent | ItemListener | Checkbox, Choice, List | 項目選狀態改變 |
JButton btn = new JButton("Click Me");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String text = ((JButton)e.getSource()).getText();
System.out.println("Clicked: " + text);
}
});
class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) { ... }
}
// 使用
btn.addActionListener(new MyActionListener());
class MyFrame extends JFrame {
private class BtnListener implements ActionListener { ... }
}
btn.addActionListener(e -> System.out.println("Clicked!"));
部分監聽器接口包含多個方法(如 MouseListener 有 5 個),直接實現接口需全部實現,繁瑣。Java 提供適配器類(MouseAdapter, WindowAdapter, KeyAdapter 等),默認提供空實現,只需繼承並覆蓋關心的方法。
class MyMouseListener extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Mouse clicked at: " + e.getPoint());
}
}
// 註冊
component.addMouseListener(new MyMouseListener());
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ButtonDemo {
private JFrame frame = new JFrame("ButtonDemo");
private JButton b1 = new JButton("按鈕1");
private JButton b2 = new JButton("按鈕2");
private JTextField txt = new JTextField(10);
// 匿名類實現 ActionListener
private ActionListener bl = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String name = ((JButton)e.getSource()).getText();
txt.setText(name);
}
};
public ButtonDemo() {
b1.addActionListener(bl);
b2.addActionListener(bl);
frame.setLayout(new FlowLayout());
frame.add(b1);
frame.add(b2);
frame.add(txt);
frame.setSize(300, 150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
new ButtonDemo();
}
}
用戶操作組件
↓
組件創建事件對象 (EventObject 子類)
↓
遍歷註冊的監聽器列表
↓
調用監聽器對應方法 (如 actionPerformed)
↓
監聽器執行業務邏輯
getSource():獲取事件源組件,區分多組件共用監聽器時的來源。SwingWorker。removeXxxListener,防止內存洩漏。Java 事件機制基於觀察者模式,通過監聽器接口與適配器類實現靈活解耦。掌握事件分類、註冊方式、匿名類/Lambda/適配器三種實現技巧,並注意 EDT 線程安全,即可開發響應流暢的桌面應用。