コンポーネントでマウスがダブルクリックされたときにアクションを実行する方法を知りたい。
public void mouseClicked(MouseEvent event)
{
if (event.getClickCount() == 2) {
System.out.println("double clicked");
}
}
Swingでの意味を想定して、コンポーネントにMouseListenerを割り当てます。
addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e){
if(e.getClickCount()==2){
// your code here
}
}
});
参照:
ユーザーが短い遅延で複数のダブルクリックを行えるようにする場合、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でテストされ、完璧です。
私の問題は、ユーザーがシングルクリックした場合に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);
}
}
});