黑马程序员技术交流社区

标题: 关于鼠标监听的单双击问题 [打印本页]

作者: 草帽    时间: 2013-7-30 00:03
标题: 关于鼠标监听的单双击问题
本帖最后由 草帽 于 2013-7-30 21:05 编辑

  1.         bt.addMouseListener(new MouseAdapter()//鼠标监听
  2.         {
  3.              private int count = 1;
  4.              private int mouseCount = 1;
  5.              public void mouseEntered(MouseEvent e)
  6.              {
  7.                                   System.out.println("鼠标监听"+count++);
  8.              }
  9.              public void mouseClicked(MouseEvent e)
  10.              {
  11.                  if(e.getClickCount()==2)
  12.                     System.out.println("鼠标被双击了");
  13.                  else System.out.println("鼠标被点击"+mouseCount++);
  14.              }
  15.          });
复制代码
以上是鼠标监听的代码,在每次双击时也都会执行单击的代码,从网上搜的结果都是判断两次单击的时间,有人提到了getTimer()这个方法应该是自己写的吧,看MouseEvent里边没有。请问这种问题就这么做吗?还有一个问题,就是如果确实是判断两次的时间,那getClickCount()方法的判断又是在多长时间内统计的呢?

作者: 手心里的温柔    时间: 2013-7-30 12:10
  1.                 this.addMouseListener(new MouseAdapter()
  2.                 {
  3.                         public void mouseClicked(MouseEvent e)
  4.                         {
  5.                                 if(e.getClickCount() == 2)
  6.                                 {
  7.                                         System.out.println("double clicked");
  8.                                 }
  9.                         }
  10.                 });
复制代码
希望能帮到你
作者: 草帽    时间: 2013-7-30 14:15
手心里的温柔 发表于 2013-7-30 12:10
希望能帮到你

这个我知道,我是说每次双击操作也都会执行单击的代码,每次都要通过两次单击的时间间隔来屏蔽单击的代码,那么getClickCount()方法是怎么计数的?两次单击的时间略长就不被记录了吗
作者: 手心里的温柔    时间: 2013-7-30 17:55
这个有点复杂,网上找了别人实现的 楼主参考一下:
  1. import java.awt.event.*;  
  2. import java.util.*;  
  3. import javax.swing.JFrame;

  4. public class Test extends MouseAdapter
  5. {  
  6.     private boolean flag = false; // 用来判断是否已经执行双击事件 ,每执行一次事件便将其置为true
  7.     private int clickNum = 0;     // 用来判断是否该执行双击事件, 每执行一次事件便将其置为0
  8.     private MouseEvent me = null;
  9.     Timer timer = new Timer();    // 创建一个定时器
  10.    
  11.     public void mouseClicked(MouseEvent e)
  12.     {
  13.             //覆写MouseAdapter中mouseClicked方法
  14.         me = e; // 接收事件源 对象
  15.         this.flag = false; // 每次点击鼠标,初始化双击事件执行标志为false  

  16.         if(this.clickNum == 1)  //当clickNum==1时执行双击事件
  17.         {  
  18.             this.mouseDoubleClicked(me);// 执行双击事件  
  19.             this.clickNum = 0; // 执行完双击事件后,初始化双击事件执行标志为0  
  20.             this.flag = true;  // 双击事件已执行,事件标志为true  
  21.             return;  
  22.         }
  23.       
  24.         //clickNum!=1时执行下面的代码
  25.         // 定时器开始执行,延时0.3秒后确定是否执行单击事件
  26.         timer.schedule( new MyTimerTask(), new Date() , 300);//从系统当前时间开始,每隔0.3s重复执行一次run()方法
  27.     }
  28.    
  29.     class MyTimerTask extends TimerTask  //定时器任务类
  30.     {
  31.      private int n = 0;// 记录定时器执行次数  
  32.         public void run()
  33.         {  
  34.             if (flag)
  35.             {// 如果双击事件已经执行,那么直接取消单击执行  
  36.                n = 0;  
  37.                clickNum = 0;  
  38.                this.cancel(); //取消此计时器任务。
  39.                return;  
  40.             }  
  41.             if (n == 1)
  42.             {// 定时器等待0.3秒后,双击事件仍未发生,执行单击事件  
  43.                mouseSingleClicked(me);// 执行单击事件  
  44.                flag = true;  
  45.                clickNum = 0;  
  46.                n = 0;  
  47.                this.cancel();   //取消此计时器任务。
  48.                return;  
  49.             }  
  50.             clickNum++;  
  51.             n++;  
  52.         }  
  53.     }
  54.    
  55.      
  56.     public void mouseSingleClicked(MouseEvent e)
  57.     {  
  58.         System.out.println("Single Clicked!");  
  59.     }  
  60.   
  61.      
  62.     public void mouseDoubleClicked(MouseEvent e)
  63.     {  
  64.         System.out.println("Double Clicked!");  
  65.     }  
  66.    
  67.     public static void main(String[] args)
  68.     {
  69.      JFrame jf = new JFrame();
  70.      jf.setSize(300,300);
  71.      jf.setVisible(true);
  72.      jf.addMouseListener(new Test());
  73.     }
  74. }
复制代码

作者: 草帽    时间: 2013-7-30 21:04
手心里的温柔 发表于 2013-7-30 17:55
这个有点复杂,网上找了别人实现的 楼主参考一下:

嗯,学习




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2