Java:忽略双击双击?

2022-09-02 22:00:52

有谁能想到一个好方法来忽略Java中双击带来的单击?

我希望每个人都有不同的行为,例如:

  • 单击在单击点上绘制十字准线
  • 双击可在屏幕上选择对象,但不应在单击点上绘制十字准线

...谁能想到一种方法来做到这一点?也许是某种计时器设置?一个想法赞赏:-)

<免责声明>...是的,我知道我正在犯下一个最令人发指的可用性/ UI错误。</免责声明>

编辑#2:

即使这有效,由于计时器令人抓狂而造成的延迟 - 我放弃了这个解决方案,并使用中键单击进行选择而不是双击...

编辑:

谢谢cgull - 这是我能够想到的,因为你确认没有简单的方法来做到这一点(请注意,如果我设置计时器<点击和计时器之间可以看到200奇数比赛,但只要我将其设置为一个值>200件事只是桃色) :

public void mouseClicked(MouseEvent e) {
    System.out.println( "Click at (" + e.getX() + ":" + e.getY() + ")" );
    if (e.getClickCount() == 2) {  
        System.out.println( "  and it's a double click!");
        wasDoubleClick = true;
    }else{
        Integer timerinterval = (Integer) 
          Toolkit.getDefaultToolkit().getDesktopProperty(
                      "awt.multiClickInterval");
        timer = new Timer(timerinterval.intValue(), new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                if (wasDoubleClick) {
                    wasDoubleClick = false; // reset flag
                } else {
                    System.out.println( "  and it's a simple click!");
                }
            }    
        });
        timer.setRepeats(false);
        timer.start();
    }
}

答案 1

实际上,您需要在鼠标适配器的被覆盖的鼠标单击()方法中设置计时器,以检测两次单击之间的时间间隔。可以通过查询 找到以毫秒为单位的默认间隔。如果在计时器过期之前检测到另一次鼠标单击,则双击,否则一旦计时器过期,就可以处理单击。Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval")


答案 2

实际上,我认为有一个更简单的解决方案(使用 InputEvent 的 getWhen() 方法):

class DCListener extends MouseAdapter{

    private long maxTimeBetweenClicks; // in millis
    private long firstClickTime=0;
    private Runnable eventHandler;

    public DCListener(long maxTimeBetweenClicks,Runnable eventHandler){
        this.maxTimeBetweenClicks=maxTimeBetweenClicks;
        this.eventHandler=eventHandler;
    }

    public void mouseClicked(MouseEvent e){

        if((e.getWhen()-firstClickTime)<=maxTimeBetweenClicks){
            firstClickTime=0; // 3 clicks are not 2 double clicks
            eventHandler.run();
        }else{
            firstClickTime=e.getWhen();
        }

    }
}