Java:忽略单击双击?
任何人都可以想到一个很好的方法来忽略在Java中双击所带来的单击?
我希望每个人都有不同的行为:
- 单击点击点击点上的十字准线
- 双击选择屏幕上的对象,但不应在点击点上绘制十字准线
……谁能想到办法做到这一点? 某种计时器设置可能吗? 一个想法赞赏:-)
……是的,我知道我犯了一个最令人发指的可用性/用户界面失礼。
编辑#2:
虽然这可以解决由于计时器引起的延迟 – 我正在放弃这个解决方案,并使用中键单击进行选择而不是双击…
编辑:
谢谢cgull – 这是我能够想出的,因为你确认没有简单的方法来做到这一点(请注意,如果我设置计时器 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(); } }
实际上,您需要在MouseAdapter的重写mouseClicked()方法中设置一个Timer,以检测两次点击之间的时间间隔。 可以通过查询Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval")
找到以ms为单位的默认时间间隔。 如果在计时器到期之前检测到另一次鼠标单击,则双击,否则计时器到期后,您可以单击一次。
实际上我认为有一个更简单的解决方案(使用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(); } } }
您是否尝试过实现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 { @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 }
我希望它有用。