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

Java Swing 鼠標事件全方位監聽實戰

     編輯:Java 相關知識

核心設計

  • JFrame 實現 MouseListener + MouseMotionListener
  • JLabel statusBar 顯示實時事件信息
  • 註冊雙監聽器:addMouseListener(this)、addMouseMotionListener(this)
  • 覆寫 7 個方法,MouseEvent.getX()/getY() 獲取座標

完整代碼


package test.lrd;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class test01 extends JFrame implements MouseListener, MouseMotionListener {
    private JLabel statusBar;

    public test01() {
        super("Java 鼠標事件監聽演示");
        statusBar = new JLabel();
        add(statusBar, BorderLayout.SOUTH);
        addMouseListener(this);
        addMouseMotionListener(this);
        setSize(275, 100);
        setVisible(true);
    }

    @Override public void mouseClicked(MouseEvent e) {
        statusBar.setText("Clicked at [" + e.getX() + "," + e.getY() + "]");
    }
    @Override public void mousePressed(MouseEvent e) {
        statusBar.setText("Pressed at [" + e.getX() + "," + e.getY() + "]");
    }
    @Override public void mouseReleased(MouseEvent e) {
        statusBar.setText("Released at [" + e.getX() + "," + e.getY() + "]");
    }
    @Override public void mouseEntered(MouseEvent e) {
        statusBar.setText("Mouse in window");
    }
    @Override public void mouseExited(MouseEvent e) {
        statusBar.setText("Mouse outside window");
    }
    @Override public void mouseDragged(MouseEvent e) {
        statusBar.setText("Dragged at [" + e.getX() + "," + e.getY() + "]");
    }
    @Override public void mouseMoved(MouseEvent e) {
        statusBar.setText("Moved at [" + e.getX() + "," + e.getY() + "]");
    }

    public static void main(String args[]) {
        test01 app = new test01();
        app.addWindowListener(new WindowAdapter() {
            @Override public void windowClosing(WindowEvent e) { System.exit(0); }
        });
    }
}

事件分類與觸發時機

介面方法觸發條件
MouseListenermouseClicked按下並釋放(單擊)
mousePressed按下瞬間
mouseReleased釋放瞬間
mouseEntered進入組件邊界
mouseExited離開組件邊界
MouseMotionListenermouseDragged按住移動
mouseMoved未按住移動

關鍵最佳實踐

  • 適配器模式:僅關心部分事件時,繼承 MouseAdapter/MouseMotionAdapter 覆寫單一方法,避免空實現
  • 座標系統:getX()/getY() 相對**事件源組件**;getXOnScreen()/getYOnScreen() 為螢幕絕對座標
  • 拖拽邏輯:mousePressed 記錄起點 → mouseDragged 計算位移更新組件位置 → mouseReleased 確認
  • 性能:高頻事件(mouseMoved、mouseDragged)避免耗時操作/日志,必要時節流

現代替代方案

  • JavaFX:setOnMouseClicked、setOnMouseDragged 等 Lambda 風格事件處理
  • Swing MouseInputAdapter:同時實現雙介面的適配器基類

總結

掌握 7 大鼠標事件觸發條件、座標系統、適配器模式、高頻事件性能考量,是構建交互式 GUI(繪圖、拖拽、游戲、編輯器)的基石。Swing 事件模型雖經典,但思想通用於所有 GUI 框架。

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