web-dev-qa-db-ja.com

javaでのダブルクリックの識別

コンポーネントでマウスがダブルクリックされたときにアクションを実行する方法を知りたい。

48
Suraj Air
public void mouseClicked(MouseEvent event)
{
  if (event.getClickCount() == 2) {
    System.out.println("double clicked");
  }
}
81
kaliatech

Swingでの意味を想定して、コンポーネントにMouseListenerを割り当てます。

addMouseListener(new MouseAdapter(){
    @Override
    public void mouseClicked(MouseEvent e){
        if(e.getClickCount()==2){
            // your code here
        }
    }
});

参照:

20

ユーザーが短い遅延で複数のダブルクリックを行えるようにする場合、e.getClickCount()==2では不十分です。デスクトップ構成によって制限されます。 Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");の結果を見ることで取得できます

問題を回避するための良い方法は、getClickCount()チェックを使用するのではなく、クリック間の最大間隔を選択できるTimerを使用し、自分でカウントを処理することです(非常に簡単です) )。

関連するコード:

boolean isAlreadyOneClick;

@Override
public void mouseClicked(MouseEvent mouseEvent) {
    if (isAlreadyOneClick) {
        System.out.println("double click");
        isAlreadyOneClick = false;
    } else {
        isAlreadyOneClick = true;
        Timer t = new Timer("doubleclickTimer", false);
        t.schedule(new TimerTask() {

            @Override
            public void run() {
                isAlreadyOneClick = false;
            }
        }, 500);
    }
}

Win Xp OSでテストされ、完璧です。

17
davidxxx

私の問題は、ユーザーがシングルクリックした場合に1つの方法で応答し、複数回クリックした場合に別の方法で応答する必要があることです(複数回クリックするとSwing VMは最大4回クリックできるようです) 。上記の例を実行すると、トリプルクリックを1つのクリックとしてカウントするように見えました。だから、ここに私の書き換えです。基本的に、ダストが消えるまで待機してから、登録されたクリック数をチェックするスケジュール済みタスクがあります。 400ミリ秒の待機時間は、私にとって最もうまくいくようです。

JButton jButton = new JButton("Click Me!");
jButton.addMouseListener(new MouseAdapter() {
    private int eventCnt = 0;
    Java.util.Timer timer = new Java.util.Timer("doubleClickTimer", false);

    @Override
    public void mouseClicked(final MouseEvent e) {
        eventCnt = e.getClickCount();
        if ( e.getClickCount() == 1 ) {
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    if ( eventCnt == 1 ) {
                        System.err.println( "You did a single click.");
                    } else if ( eventCnt > 1 ) {
                        System.err.println("you clicked " + eventCnt + " times.");
                    }
                    eventCnt = 0;
                }
            }, 400);
        }
    }
});
0
Warren Weis