4

セルがダブルクリックされたときに関数を呼び出し、セルがトリプルクリックされたときに別の関数を呼び出す JTable があります。

セルがトリプルクリックされたときに、ダブルクリック機能を呼び出したくありません。

私が今持っているのは(mgrdAlarmはJTableです):

mgrdAlarm.addMouseListener(new MouseAdapter()
{
  public void mouseClicked(MouseEvent e)
  {
    System.out.println("getClickCount() = " + e.getClickCount());
    if (e.getClickCount()==2)
    {
      doubleClick();
      System.out.println("Completed : doubleClick()");
    }
    if (e.getClickCount()==3)
    {
      tripleClick();
      System.out.println("Completed : tripleClick()");
    }
  }
});

コンソールをダブルクリックすると、次のように表示されます。

getClickCount() = 1
getClickCount() = 2
Completed : doubleClick()

コンソールをトリプルクリックすると、次のように表示されます。

getClickCount() = 1
getClickCount() = 2
Completed : doubleClick()
getClickCount() = 3
Completed : tripleClick()

トリプルクリックすると、コンソールに次のように表示されます。

getClickCount() = 1
getClickCount() = 2
getClickCount() = 3
Completed : tripleClick()

したがって、セルがトリプルクリックされたときに関数 doubleClick() を呼び出したくありませんが、セルがダブルクリックされたときに関数 doubleClick() を呼び出したいです。

[編集]

すべての返信が示唆しているように、解決策はダブルクリックアクションを遅らせ、トリプルクリックを一定時間待つことです。

しかし、ここで説明したように、別のタイプの問題につながる可能性があります。ユーザーがダブルクリック時間をかなり長く設定した可能性があり、トリプルクリックのタイムアウトと重なる可能性があります。

ダブルクリック アクションがトリプル クリック アクションの前に実行されても、それは実際の災害ではありませんが、余分なオーバーヘッドが発生し、特に防止したい余分なデータ トラフィックが発生します。

これまでの唯一の解決策は、実際には元の問題よりも悪い他の問題につながる可能性があるため、そのままにしておきます。

4

7 に答える 7

2

前の回答は正しいです。タイミングを考慮し、一定の時間が経過するまでダブルクリックとして認識するのを遅らせる必要があります。問題は、お気づきのように、ユーザーのダブル クリックのしきい値が非常に長い場合と非常に短い場合があることです。したがって、ユーザーの設定が何であるかを知る必要があります。この他のスタック オーバーフロー スレッド ( Java でシングル クリックとダブル クリックを区別するawt.multiClickInterval) は、デスクトップ プロパティについて言及しています。それをしきい値に使用してみてください。

于 2013-04-22T03:39:22.527 に答える
1

遅延時間を変えて、そのようなことをすることができます:

public class ClickForm extends JFrame {

final static long CLICK_FREQUENTY = 300;

static class ClickProcessor implements Runnable {

    Callable<Void> eventProcessor;

    ClickProcessor(Callable<Void> eventProcessor) {
        this.eventProcessor = eventProcessor;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(CLICK_FREQUENTY);
            eventProcessor.call();
        } catch (InterruptedException e) {
            // do nothing
        } catch (Exception e) {
            // do logging
        }
    }
}

public static void main(String[] args) {
    ClickForm f = new ClickForm();
    f.setSize(400, 300);
    f.addMouseListener(new MouseAdapter() {
        Thread cp = null;
        public void mouseClicked(MouseEvent e) {
            System.out.println("getClickCount() = " + e.getClickCount() + ", e: " + e.toString());

            if (cp != null && cp.isAlive()) cp.interrupt();

            if (e.getClickCount() == 2) {
                cp = new Thread(new ClickProcessor(new Callable<Void>() {
                    @Override
                    public Void call() throws Exception {
                        System.out.println("Double click processed");
                        return null;
                    }
                }));
                cp.start();
            }
            if (e.getClickCount() == 3) {
                cp =  new Thread(new ClickProcessor(new Callable<Void>() {
                    @Override
                    public Void call() throws Exception {
                        System.out.println("Triple click processed");
                        return null;
                    }
                }));
                cp.start();
            }
        }
    });
    f.setVisible(true);
}
}
于 2013-01-16T08:22:21.640 に答える
0

ここにこれに関するチュートリアルがあり ます

編集: ただし、クリックイベントは個別に発生するため、次のようになります: シングルクリック THEN ダブルクリック THEN トリプルクリック. したがって、まだタイミングのトリックを行う必要があります。

コードは次のとおりです。

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class Main {
  public static void main(String[] argv) throws Exception {

    JTextField component = new JTextField();
    component.addMouseListener(new MyMouseListener());
    JFrame f = new JFrame();

    f.add(component);
    f.setSize(300, 300);
    f.setVisible(true);

    component.addMouseListener(new MyMouseListener());
  }
}

class MyMouseListener extends MouseAdapter {
  public void mouseClicked(MouseEvent evt) {
    if (evt.getClickCount() == 3) {
      System.out.println("triple-click");
    } else if (evt.getClickCount() == 2) {
      System.out.println("double-click");
    }
  }
}
于 2013-06-03T13:15:07.547 に答える
0

シングルクリックを発火せずにダブルクリックを検出するのとまったく同じ問題です。次のクリックがないことを確認するまで、イベントの発生を遅らせる必要があります。

于 2013-01-16T08:53:44.150 に答える
0

の実行を遅らせて、double clickそれが a かどうかを確認する必要がありtripple clickます。

ヒント。

もしgetClickCount()==2それからそれを待つ..のように言うために200ms

于 2013-01-16T08:11:26.733 に答える