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

Java 滑鼠事件完整解析:MouseListener 與 MouseMotionListener 差異詳解

     編輯:Java 相關知識

兩大核心介面

Java AWT 提供兩個介面監聽滑鼠事件:

1. MouseListener — 靜態事件

public interface MouseListener extends EventListener {
    public void mousePressed(MouseEvent e);   // 按下滑鼠鍵
    public void mouseReleased(MouseEvent e);  // 鬆開滑鼠鍵
    public void mouseClicked(MouseEvent e);   // 按下並鬆開(點擊)
    public void mouseEntered(MouseEvent e);   // 滑鼠進入元件
    public void mouseExited(MouseEvent e);    // 滑鼠離開元件
}

2. MouseMotionListener — 動態事件

public interface MouseMotionListener extends EventListener {
    public void mouseDragged(MouseEvent e);   // 按下並移動(拖曳)
    public void mouseMoved(MouseEvent e);     // 移動未按下
}

Swing 提供 MouseInputListener 同時擴展兩介面。

關鍵差異:mouseClicked vs mousePressed/mouseReleased

  • mousePressed: 使用者按下滑鼠鍵時觸發
  • mouseReleased: 使用者鬆開滑鼠鍵時觸發
  • mouseClicked: 使用者按下並鬆開滑鼠鍵時觸發。若在鬆開前移動滑鼠,點擊事件不會觸發

事件觸發順序: 因點擊是按下+鬆開的結合,事件分派給 mouseClicked() 前,mousePressed() 和 mouseReleased() 已同時被呼叫。

其他事件說明

  • mouseEntered: 滑鼠離開當前元件並進入監聽元件時觸發
  • mouseExited: 滑鼠離開監聽元件時觸發
  • mouseDragged: 按下滑鼠鍵並在鬆開前移動時觸發。拖曳後鬆開不會觸發 mouseClicked
  • mouseMoved: 滑鼠在元件上移動但未拖曳時觸發

監聽適配器:簡化實作

監聽滑鼠事件須實作介面或擴展適配器類。AWT 提供:

  • java.awt.event.MouseAdapter
  • java.awt.event.MouseMotionAdapter

Swing 為 MouseInputListener 提供 javax.swing.event.MouseInputAdapter。使用適配器毋須實作介面所有方法,只需擴展適配器並覆寫需監聽的方法。

實作測試程式:觀察事件觸發順序

import java.awt.*;
import java.awt.event.*;

public class MouseTest extends Frame {
    public MouseTest() {
        Button b = new Button("JavaWorld JavaQ&A");
        b.addActionListener(e -> System.exit(0));
        add(b, BorderLayout.NORTH);
        addMouseListener(new MouseHandler());
        addMouseMotionListener(new MouseMotionHandler());
    }
    
    private class MouseHandler implements MouseListener {
        public void mousePressed(MouseEvent e) { System.out.println("mouse pressed"); }
        public void mouseClicked(MouseEvent e) { System.out.println("mouse clicked"); }
        public void mouseReleased(MouseEvent e) { System.out.println("mouse released"); }
        public void mouseEntered(MouseEvent e) { System.out.println("mouse entered"); }
        public void mouseExited(MouseEvent e) { System.out.println("mouse exited"); }
    }
    
    private class MouseMotionHandler implements MouseMotionListener {
        public void mouseMoved(MouseEvent e) { System.out.println("mouse moved"); }
        public void mouseDragged(MouseEvent e) { System.out.println("mouse dragged"); }
    }
    
    public static void main(String[] args) { new MouseTest().show(); }
}

此程式建立視窗與按鈕,移動滑鼠並按下時,命令列列印文字訊息,讓你直觀看到滑鼠回應與事件對應關係。寫小測試程式是嘗試陌生 API 的好方法。

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