importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.MouseAdapter;importjava.awt.MouseEvent;public class MyMouseClickListener extends MouseAdapter implementsMouseListener{

// 取得当前操作系统的双击时间长度参数private final static int MULTI_CLICK_INTERVAL = Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");privateMouseEvent lastEvent;privateTimer timer;

private int mouseButtonNumber = -1;publicMyMouseClickListener(){this(MULTI_CLICK_INTERVAL);

}public MyMouseClickListener(intdelay){

// 初始化一个计数器。这个计数器在启动以后,经过delay长的时间,自动停止。this.timer = new Timer(delay,this);

}

@overridepublic voidmouseClicked(MouseEvent e){if(e.getClickCount > 2){return;

}

lastEvent=e;

// 如果计时器还在运行,且上次鼠标是左键点击,且本次点击也是左键点击,则视为合法左键双击。if(timer.isRunning() && mouseButtonNumber == MouseEvent.BUTTON1 && e.getButton == MouseEvent.BUTTON1){

timer.stop();

doubleClicked(lastEvent);

}else{

timer.restart();

mouseButtonNumber = e.getButton();

}

}

/*

* 单击以后的处理,自行覆盖

*/public voidsingleClicked(MouseEvent e){

}

/*

* 双击以后的处理,自行覆盖编写

*/public voiddoubleClicked(MouseEvent e){

}

@overridepublic voidactionPerformed(ActionEvent e){

timer.stop();

singleClicked(lastEvent);

}

}

1.核心原理:双击以后,双击中的第一下点击会启动timer,这时候timer开始计时,因为timer在经过指定时间delay以后进入停止状态,所以当第二下点击到来的时候,判断timer是否isRunning(),就能够知道这两次点击的时间间隔是否满足

当前操作系统的设置。如果timer.isRunning() == true,说明是合法双击,这时调用doubleClicked()方法,如果timer.isRunning == false说明两次点击时间间隔已经超过系统承认的时间间隔,将第二次点击作为下一轮判断的第一次点击。

2.判断是否是鼠标左键的双击,如果没有对e.getButton()的判断,双击两下鼠标上的任何按键都能触发doubleClicked方法。

3.上面代码的实现过程中,容易出错和被忽略的是timer.restart()方法的调用时机。

下面加上一个根据这个原理实现的JTable的双击监听器,

前提是把MyMouseClickListener中的private属性改为protected修饰。

public class MyTableMouseClickListener extendsMyMouseClickListener{protected JTable table1 = null;protected int line = -1;

@overridepublic voidmouseClicked(MouseEvent e){if(e.getClickCount() == 1){

table1=(JTable)(e.getSource());

line=table1.getSelectedRow();

timer.restart();

mouseButtonNumber=e.getButton();return;

}if(e.getClickCount() > 2){return;

}

JTable table2=(JTable)(e.getSource());if((null == table1 || table2 != table1) || table2.getSelectedRow{} !=line){return;

}

lastEvent= 2;if(timer.isRunning() && mouseButtonNumber == MouseEvent.BUTTON1 && e.getButton() ==MouseEvent.BUTTON1){

timer.stop();

doubleClicked(lastEvent);

}

}

}

1、JTable某行的双击事件在应用中比较普遍,但即使解决了鼠标左键双击的问题,还存在一个问题,如果双击的两下点击动作分别落在表格的两行上也被认为是合法的,

但这并不是我们想要的。

2、改造mouseClicked方法,在左键点击第一下以后记下点击的JTable对象及点击的行号,待第二下左键点击以后两厢进行对比验证,相同的再触发doubleClicked方法。

3、需要注意的还是timer.restart()方法的调用时机,防止timer在stop了以后没有及时restart造成timer没有启动,无法准确及时调用doubleClicked的问题。

java如何判断鼠标双击_Swing中如何比较好的判断鼠标左键双击相关推荐

  1. MFC中由左键单击模拟左键双击引起的问题

    项目需要根据左键单击计时的手段来模拟左键双击的效果. msdn对于WM_LBUTTONDBLCLK中有一句: Only windows that have the CS_DBLCLKS style c ...

  2. Visual C++——无法响应WM_LBUTTONDBLCLK消息(鼠标左键双击)问题解决方案

    问题描述 在建立win32窗口项目的时候,发现窗口无法响应WM_LBUTTONDBLCLK(鼠标左键双击)消息. MSDN https://docs.microsoft.com/en-us/previ ...

  3. 鼠标左键双击图标出现属性窗口的问题

    就是鼠标左键双击出来的全部都是属性了,比如说我的电脑,回收站,网络,双击打开都是属性. ======================================================== ...

  4. matlab中关于pushbotton的左键双击响应问题

    如注释所示,我想在按钮上实现四种点击响应,在运行的时候,其它的都行,就是无法实现"左键双击变蓝色"的效果,程序也没有任何报错信息,求大侠指点下到底是烦什么?怎么修改?如果有更好的办 ...

  5. win10鼠标左键双击经常进不去文件夹【closed】

    缘起:电脑重装了win10系统,用鼠标左键双击经常进不去文件夹,要么是没反应,要么就是选中文件夹名字,让我对文件夹字进行编辑.通过网上查阅资料以及个人实践,发现问题并找到解决方法,本文给出解决该问题的 ...

  6. 鼠标左键双击变成打开“属性”,其他按键失灵

    鼠标左键双击变成打开属性,其他按键失灵的问题 **TMD服了,原来是Alt键卡键了!!!

  7. Listary 6.0 pro 如何关闭左键双击出现快捷菜单?

    文章目录 一.小序 二.教程 三.本次受害者Fence4 一.小序 为什么需要关闭左键双击弹出快捷菜单呢?当然是因为中键一次可以有同样操作,且左键双击与我的Fence4双击隐藏桌面的功能冲突了. 二. ...

  8. 当鼠标左键双击弹出多个时

    你是否遇到过这样的问题,鼠标左键时间长了不好用了,双击会打开多个窗口,怎么办,可以调节硬件设置, 控制面板-------鼠标--------硬件--------属性----------采样频率 ,调节 ...

  9. python中的成员运算符用于判断指定序列_Python中的成员运算符用于判断指定序列中是否包含某个值。...

    [多选题]下列关于鲜活商品的说法哪些是正确的 [单选题]企业接受新投资者投资时其实际缴纳的出资额大于其所享有注册资本所占份额的部分应计入 [单选题]企业的管理费用.财务费用和销售费用应属于企业的[   ...

最新文章

  1. 面试官:Java中 serialVersionUID 的作用是什么?举个例子说明
  2. React学习笔记1:React基本概念
  3. R语言dataframe计算满足筛选条件的行的个数(筛选满足条件的数据行并计数):类似于excel的countif函数
  4. 影像组学视频学习笔记(18)-使用MRIcroGL软件格式转换、勾画ROI、Li‘s have a solution and plan.
  5. 32位大写 md5 php_编写生成32位大写和小写字符的md5的函数
  6. java 客户端发起http请求2
  7. 牛客多校4 - Basic Gcd Problem(预处理质因子的个数)
  8. java 并发编程视频教程_全面深入学习java并发编程,视频教程下载
  9. 第一百一十六期:不能错过!你必须知道的3种重要Python技能
  10. Java获取登录用户IP地址
  11. 高效能人士的七个习惯_有史以来最具影响力管理类书籍 高效能人士的七个习惯 让你成为一名成功高效的人士...
  12. 【优化算法】乌燕鸥优化算法(STOA)【含Matlab源码 1431期】
  13. Ubuntu对CPU进行测试
  14. 电子设计硬件可靠性设计--总结
  15. JZOJ4722. 【NOIP2016提高A组模拟8.21】跳楼机
  16. Android权限设置 for Unity
  17. English in December
  18. 第二章 年轻人都是富翁
  19. Ubuntu 屏幕颜色校准
  20. 分享155个ASP源码,总有一款适合您

热门文章

  1. 无犯罪证明(开证明指南山西籍)
  2. js的 算法 和 数据结构
  3. matlab中字母重音符号,英语音标中的符号
  4. 活动倒计时|您有一封RTSCon 2022圆桌会议邀请函
  5. 【MODIS】MODIS数据的两种批量下载方法 - Python和Wget
  6. 计算机课万能,信息技术万能说课稿
  7. ACL组委会手把手教你论文投稿小技巧
  8. ssm高考志愿智能选择系统 毕业设计源码134565
  9. mysql acer_我购买了一台acer笔记本
  10. 《彩色方块对对碰 Android 版》(TetraVex) 经典休闲益智类游戏免费发布!