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