Java:忽略单击双击?

时间:2009-02-14 00:06:09

标签: java events click mouse double-click

任何人都可以想到一种忽略Java中双击的单击的好方法吗?

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

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

......任何人都可以想到这样做的方法吗?某种计时器设置可能吗?赞赏的想法: - )

<声明> ......是的,我知道我犯了一个最令人发指的可用性/用户界面失礼。 < /声明>

编辑#2:

即使这可以解决由于计时器造成的延迟 - 我正在放弃这个解决方案,并使用中键单击进行选择而不是双击......

修改

谢谢cgull - 这是我能够提出的,因为您确认没有简单的方法可以做到这一点(请注意,如果我设置计时器< 200奇数赛车在点击和放大器之间看到;计时器,但只要我将其设置为一个值> 200的东西只是peachy):

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();
    }
}

4 个答案:

答案 0 :(得分:16)

实际上,您需要在MouseAdapter的重写mouseClicked()方法中设置一个Timer,以检测两次点击之间的时间间隔。可以通过查询找到以ms为单位的默认时间间隔 Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval")。如果在计时器到期之前检测到另一个鼠标单击,则双击,否则计时器到期后,您可以单击一次。

答案 1 :(得分: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();
        }

    }
}

答案 2 :(得分:0)

您是否尝试过实现MouseListener接口?

我认为MouseEvent有一个点击计数方法(或属性)来了解它。

我打赌你已经完成了这个,所以你面临的问题是什么?

你可以做的就是用线程或其他东西对单次和双击之间经过的时间间隔进行编码。

因此,如果没有发出另外一次点击,那么只需点击300毫秒,单击即可生效。 (可配置的东西)

这个想法是:

public void listen for the single click() 
    if (  in x time there has not been another click  ) 
    then 
        we have a single click
        proceed with your single click handling
    else 
        we have a double click
       proceed with your double click handling

或类似的东西。

答案 3 :(得分:0)

另一种解决方案:

在我在这个问题中找到解决方案之前,我已经弄明白了。这个想法是一样的,使用计时器,虽然更复杂:)。

使用SwingWorker

class BackgroundClickHandler extends SwingWorker<Integer, Integer> {
  @Override
  protected Integer doInBackground() throws Exception {
    Thread.sleep(200);
    // Do what you want with single click
    return 0;
  }

}

mouseClicked()方法中,您可以执行以下操作:

 if (event.getClickCount() == 1) {
  // We create a new instance everytime since
  // the execute() method is designed to be executed once
  clickHandler = new BackgroundClickHandler();

  try {
    clickHandler.execute();
  } catch(Exception e) {
    writer.println("Here!");
  }
}

if (event.getClickCount() == 2) {
  clickHandler.cancel(true);

  //Do what you want with double click
}

我希望它有用。