转:java 鼠标单击和双击的控制

前序:
   在一个项目中为了使用方便,我们需要完成这样一个功能,既是鼠标单击一个swing按钮时,弹出A对话框,双击同一个按钮时弹出B对话框。
  第一个实现:
   首先想到的是:MouseEvent.getClickCount()==1 或是 ==2来区分,开始想的易如反掌,只有到开始测试时才发现,这样根本就不会有效果。在单击时,一切正常,A对话框如愿的显示了。可是在双击时,B对话框显示了,同时A对话框也厚颜无耻的出现了,我们并没有邀请他啊。:)不该来的也来了。
  凝思中:
   仔细分析,才发现A对话框并不是那么没有自知之明,它确实也是收到了邀请。在我们双击的时候,时间列队里果真有一个ClickCount==1的鼠标事件,后边才是ClickCount==2的鼠标事件。实际上不论你是连续点击几次,java都总是一次发送鼠标事件,从ClickCount=1、ClickCount=2、ClickCount=3 ……依次发送
  解决的办法:
   程序收到一个ClickCount=1的事件时,怎么知道它是双击事件第一个事件,还是单击事件呢?若是单击事件,就处理;若是紧跟着还有一个ClickCount = 2的事件我们就要放弃这个事件。
   为了实现这么令人为难的办法,我们只好,在每次接到单击事件时,等待一段时间,看看后续的特定时间内是否有双击的事件产生,若是有,就放弃单前的单击事件,若是没有,就处理单击事件。
   (发现好蠢!)
  示例代码:
  if (e.getClickCount() == 1) {
   mouseTimer = new javax.swing.Timer(350, new ActionListener() {
   public void actionPerformed(ActionEvent evt) {
   System.out.println("Single");
   mouseTimer.stop();
   }
   });
   mouseTimer.restart();
   } else if (e.getClickCount() == 2 && mouseTimer.isRunning()) {
   mouseTimer.stop(); 
   System.out.println("Double");
   }
  一点建议:
   实际上,文中给出的解决并不是完美的,甚至可以说是愚蠢的。但是若一阵要这样,并没有更好的办法了(个人意见)。
   回头想想,为何会遇上这样的问题,最大的原因是因为没有把单击和双击得响应设计好,他们不能很好的兼容。

 

 

原文地址:https://www.cnblogs.com/youxin/p/2798899.html