Swing中如何比較好的判斷鼠標左鍵雙擊


import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.MouseAdapter;
import java.awt.MouseEvent;
public class MyMouseClickListener extends MouseAdapter implements MouseListener{
    // 取得當前操作系統的雙擊時間長度參數
    private final static int MULTI_CLICK_INTERVAL = Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");
    private MouseEvent lastEvent;
    private Timer timer;
    private int mouseButtonNumber = -1;
public MyMouseClickListener(){ this(MULTI_CLICK_INTERVAL); } public MyMouseClickListener(int delay){ // 初始化一個計數器。這個計數器在啟動以后,經過delay長的時間,自動停止。
this.timer = new Timer(delay,this); } @override public void mouseClicked(MouseEvent e){ if(e.getClickCount > 2){ return; } lastEvent = e;

// 如果計時器還在運行,且上次鼠標是左鍵點擊,且本次點擊也是左鍵點擊,則視為合法左鍵雙擊。
if(timer.isRunning() && mouseButtonNumber == MouseEvent.BUTTON1 && e.getButton == MouseEvent.BUTTON1){
timer.stop(); doubleClicked(lastEvent); }else{
timer.restart();
mouseButtonNumber = e.getButton();
} }
/*
* 單擊以后的處理,自行覆蓋
*/
public void singleClicked(MouseEvent e){ }
/*
* 雙擊以后的處理,自行覆蓋編寫
*/
public void doubleClicked(MouseEvent e){ } @override public void actionPerformed(ActionEvent e){
timer.stop(); singleClicked(lastEvent); } }

1.核心原理:雙擊以后,雙擊中的第一下點擊會啟動timer,這時候timer開始計時,因為timer在經過指定時間delay以后進入停止狀態,所以當第二下點擊到來的時候,判斷timer是否isRunning(),就能夠知道這兩次點擊的時間間隔是否滿足
當前操作系統的設置。如果timer.isRunning() == true,說明是合法雙擊,這時調用doubleClicked()方法,如果timer.isRunning == false說明兩次點擊時間間隔已經超過系統承認的時間間隔,將第二次點擊作為下一輪判斷的第一次點擊。

2.判斷是否是鼠標左鍵的雙擊,如果沒有對e.getButton()的判斷,雙擊兩下鼠標上的任何按鍵都能觸發doubleClicked方法。

3.上面代碼的實現過程中,容易出錯和被忽略的是timer.restart()方法的調用時機。

 

下面加上一個根據這個原理實現的JTable的雙擊監聽器,

前提是把MyMouseClickListener中的private屬性改為protected修飾。

public class MyTableMouseClickListener extends MyMouseClickListener{
    protected JTable table1 = null;
    protected int line = -1;

    @override
    public void mouseClicked(MouseEvent e){

        if(e.getClickCount() == 1){
            table1 = (JTable)(e.getSource());
            line = table1.getSelectedRow();
            timer.restart();
            mouseButtonNumber = e.getButton();
            return;
        }
        if(e.getClickCount() > 2){
            return;
        }
        JTable table2 = (JTable)(e.getSource());
        if((null == table1 || table2 != table1) || table2.getSelectedRow{} != line){
            return;
        }
        lastEvent = 2;
        if(timer.isRunning() && mouseButtonNumber == MouseEvent.BUTTON1 && e.getButton() == MouseEvent.BUTTON1){
            timer.stop();
            doubleClicked(lastEvent);
        }
    }
}

1、JTable某行的雙擊事件在應用中比較普遍,但即使解決了鼠標左鍵雙擊的問題,還存在一個問題,如果雙擊的兩下點擊動作分別落在表格的兩行上也被認為是合法的,
但這並不是我們想要的。

2、改造mouseClicked方法,在左鍵點擊第一下以后記下點擊的JTable對象及點擊的行號,待第二下左鍵點擊以后兩廂進行對比驗證,相同的再觸發doubleClicked方法。

3、需要注意的還是timer.restart()方法的調用時機,防止timer在stop了以后沒有及時restart造成timer沒有啟動,無法准確及時調用doubleClicked的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM