Java:忽略单击双击?

问题描述:

任何人都可以想出一种很好的方法来忽略Java中双击出现的单击操作吗?Java:忽略单击双击?

我期待有不同的行为,为每个这样的:

  • 单点击画上的点击点
  • 双击选择屏幕上的对象十字线,但应该点击点上漆十字线

......任何人都可以想出一种方法来做到这一点?某种定时器设置可能?一个想法表示赞赏:-)

<免责声明> ...是的,我知道我犯了一个非常可憎的可用性/用户界面失算。 < /免责声明>

编辑#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(); 
    } 
} 
+0

这可怎么工作的? wasDoubleClick不能是最终的,它在另一个类中使用(匿名ActionListener一个) – alessiop86 2012-09-15 10:20:14

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

你试过已经实现的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 

或者类似的东西。

另一种解决方案:

我想通了,在此之前,我发现这个问题的解决方案。这个想法是一样的,使用一个计时器,虽然更复杂:)。

使用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 
} 

我希望它是有用的。

其实我觉得这是一个简单的解决方案(使用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(); 
     } 

    } 
}