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

Java Applet 事件處理機制與 Action 事件實作範例

     編輯:Java 程式設計入門

事件處理架構

Java AWT 採用「事件委派模型」:事件源 → 事件物件 → 事件監聽器。Applet 繼承自 Component,可直接註冊各類監聽器。

範例程式碼分析

原始碼結構

public class AppletEvent extends Applet {
    int x = 100, y = 40;
    Button btn;
    Color clr = Color.red;

    public AppletEvent() {
        btn = new Button("你就按著玩兒吧!");
        add("Center", btn);  // BorderLayout.CENTER
    }

    public void paint(Graphics g) {
        g.setColor(Color.red);
        g.setFont(new Font("Helvetica", Font.PLAIN, 24));
        g.drawString("InofCD歡迎您!", x, y);
    }

    // Java 1.0 風格事件處理 (已淘汰)
    public boolean action(Event ev, Object arg) {
        if (ev.target instanceof Button) {
            y += 10; x -= 10;
            if (y >= 250) y = 10;
            if (x <= 0) x = 100;
            repaint();
            return true;  // 事件已處理
        }
        return false;  // 向上傳遞
    }
}

關鍵問題:使用已淘汰的 Java 1.0 事件模型

  • action(Event, Object) 屬於 Java 1.0 事件模型,自 Java 1.1 起標記為 @Deprecated
  • 現代程式碼應改用 ActionListener 介面
  • Event 類別已被 AWTEvent 子類別取代 (ActionEvent、MouseEvent 等)

現代化改寫:ActionListener 模式

public class ModernAppletEvent extends Applet implements ActionListener {
    int x = 100, y = 40;
    Button btn;

    public void init() {
        setLayout(new BorderLayout());
        btn = new Button("你就按著玩兒吧!");
        btn.addActionListener(this);  // 註冊監聽器
        add(btn, BorderLayout.CENTER);
    }

    public void paint(Graphics g) {
        g.setColor(Color.red);
        g.setFont(new Font("Helvetica", Font.PLAIN, 24));
        g.drawString("歡迎您!", x, y);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btn) {
            y += 10; x -= 10;
            if (y >= 250) y = 10;
            if (x <= 0) x = 100;
            repaint();
        }
    }
}

完整事件處理最佳實務

事件類型監聽器介面事件類別註冊方法
按鈕點擊ActionListenerActionEventaddActionListener
滑鼠點擊/移動MouseListener / MouseMotionListenerMouseEventaddMouseListener
鍵盤輸入KeyListenerKeyEventaddKeyListener
視窗狀態WindowListenerWindowEventaddWindowListener
元件大小/位置ComponentListenerComponentEventaddComponentListener
焦點變化FocusListenerFocusEventaddFocusListener
滑鼠滾輪MouseWheelListenerMouseWheelEventaddMouseWheelListener

匿名內部類別與 Lambda 簡化

// 匿名類別 (Java 7 相容)
btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) { ... }
});

// Lambda 表示式 (Java 8+)
btn.addActionListener(e -> { ... });

// 方法參考
btn.addActionListener(this::handleButtonClick);

事件處理常見陷阱

  • 事件阻塞 UI 執行緒:actionPerformed 中執行耗時操作會凍結介面,應使用 SwingWorker 或執行緒池
  • 重複註冊:多次呼叫 addActionListener 導致事件觸發多次
  • 焦點問題:KeyListener 需元件擁有焦點,建議使用 KeyBinding (Swing)
  • 記憶體洩漏:匿名類別持有外部類別參考,長期存活的元件需注意移除監聽器
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved