鼠标的单双击事件在很多时候对我们帮助很大,但是在JAVA中却没有给出鼠标双击事件.我们可以通过事件源e.getClickCount()==2来判断鼠标点击次数来实现鼠标双击事件,例如:
public
class
MyMouseListener
extends
java.awt.event.MouseAdapter
...
{ public void mouseClicked(MouseEvent e) ... { System.out.println( " clicked " ); int clickTimes = e.getClickCount(); if (clickTimes == 2 ) ... { System.out.println( " Doublc Clicked! " ); } } }
但是这样并没有达到我们的要求,因为在每次触发双击事件的同时会触发单击事件.所以我们试图改进以上方案,不使用系统提供的e.getClickCount()方法.可以考虑当第一次单击鼠标的时候让鼠标单击事件延时0.2秒执行,而在这段时间里等待第二次单击,如果有第二次单击,那么我们执行双击事件任务,取消单击任务;如果在这段时间没有等到再次单击,那么执行单击任务.
下面是用定时器延时单击事件实现鼠标双击事件,单击和双击事件互不影响!
public
class
MyMouseListener
extends
java.awt.event.MouseAdapter
...
{ private static boolean flag = false ; // 用来判断是否已经执行双击事件 private static int clickNum = 0 ; // 用来判断是否该执行双击事件 public void mouseClicked(MouseEvent e) ... { final MouseEvent me = e; // 事件源 this .flag = false ; // 每次点击鼠标初始化双击事件执行标志为false if ( this .clickNum == 1 ) ... { // 当clickNum==1时执行双击事件 this .mouseDoubleClicked(me); // 执行双击事件 this .clickNum = 0 ; // 初始化双击事件执行标志为0 this .flag = true ; // 双击事件已执行,事件标志为true return ; } // 定义定时器 java.util.Timer timer = new java.util.Timer(); // 定时器开始执行,延时0.2秒后确定是否执行单击事件 timer.schedule( new java.util.TimerTask() ... { private int n = 0 ; // 记录定时器执行次数 public void run() ... { if (MyMouseListener.flag) ... { // 如果双击事件已经执行,那么直接取消单击执行 n = 0 ; MyMouseListener.clickNum = 0 ; this .cancel(); return ; } if (n == 1 ) ... { // 定时器等待0.2秒后,双击事件仍未发生,执行单击事件 mouseSingleClicked(me); // 执行单击事件 MyMouseListener.flag = true ; MyMouseListener.clickNum = 0 ; n = 0 ; this .cancel(); return ; } clickNum++ ; n ++ ; } }, new java.util.Date(), 200 ); } /** */ /** * 鼠标单击事件 * @param e 事件源参数 */ public void mouseSingleClicked(MouseEvent e) ... { System.out.println( " Single Clicked! " ); } /** */ /** * 鼠标双击事件 * @param e 事件源参数 */ public void mouseDoubleClicked(MouseEvent e) ... { System.out.println( " Doublc Clicked! " ); } }