儿濡目染的意思:(转)JAVA中的鼠标双击事件与单击事件同时存在

来源:百度文库 编辑:偶看新闻 时间:2024/05/04 19:46:56
(转)JAVA中的鼠标双击事件与单击事件同时存在--使用一个定时器
2010-02-10 12:17
鼠标的单双击事件在很多时候对我们帮助很大,但是在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!");
   }
}