Swing中如何比较好的判断鼠标左键双击
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.MouseAdapter;
import java.awt.MouseEvent;
public class MyMouseClickListener extends MouseAdapter implements MouseListener{
// 取得当前操作系统的双击时间长度参数
private final static int MULTI_CLICK_INTERVAL = Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");
private MouseEvent lastEvent;
private Timer timer;
private int mouseButtonNumber = -1;
public MyMouseClickListener(){
this(MULTI_CLICK_INTERVAL);
} public MyMouseClickListener(int delay){
// 初始化一个计数器。这个计数器在启动以后,经过delay长的时间,自动停止。
this.timer = new Timer(delay,this);
} @override
public void mouseClicked(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 void singleClicked(MouseEvent e){ }
/*
* 双击以后的处理,自行覆盖编写
*/
public void doubleClicked(MouseEvent e){ } @override
public void actionPerformed(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 extends MyMouseClickListener{
protected JTable table1 = null;
protected int line = -1;
@override
public void mouseClicked(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的问题。
Swing中如何比较好的判断鼠标左键双击的更多相关文章
- JavaScript经典代码【二】【javascript判断用户点了鼠标左键还是右键】
IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0 默认.没有按任何按钮. events.b ...
- zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...
- [Eclipse] eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件【待解决】
eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件: 1. 设置eclipse ctrl + 左键打开源文件代码,如下图,设置都正常 2. 在网上找了很多种办法,均失败,在 ...
- Eclipse 中 ctrl+鼠标左键 快捷查看资源失效
Eclipse 中 ctrl+鼠标左键 快捷查看资源失效 看看eclipse 工作空间配置的jdk是什么版本,看看本地环境变量中的jdk是什么版本,将二者的版本统一即可. 笔者从git上clone一个 ...
- C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框
最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...
- 【转】 js怎么区分出点击的是鼠标左键还是右键?
IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0 默认.没有按任何按钮. events. ...
- delphi Ctrl+鼠标左键或者Find Declaration不能定位到源文件
在Delphi代码编辑器中使用Ctrl+鼠标左键可跳转到鼠标下的类所在的定义处,但今天发现一个奇怪的问题,EhLib组件的类无法跳转(包括uses中的pas文件),重新安装也是如此,后来经过验证,发现 ...
- USB 驱动(监测鼠标左键的动作)
(基于 Linux 3.4.2 内核) 可分为以下几个步骤来完成这个驱动: 1. 分配设置一个 usb_driver 结构体 2. 注册这个 usb_driver (如果设备的 id_table 与驱 ...
- Winform 基础二 最小化 最大化 关闭 点击任务栏隐藏显示 点击鼠标左键移动窗体
一 最大化 二 最小化 三 关闭 四 点击任务栏隐藏显示 五 点击鼠标左键移动窗体 六 阴影效果鼠标左键移动窗口 #region UI设置 最大化.最小化.关闭.鼠标移动窗口.点击任务栏切换窗口 th ...
随机推荐
- Uboot的bad_save_user_regs
下面是一个宏定义,从名字“bad_save_user_regs”就可以猜测它是用来保存程序“出错”时用户态的寄存器的值. 从下面的“use bad_save_user_regs for abort/p ...
- ORM框架为什么不流行了
程序员的逻辑是先写sql脚本,然后在编写对应的实体代码. orm框架的逻辑是先写实体代码,然后自动生成脚本,构建数据库,这和程序员的逻辑或习惯刚好相反,所以这类ORM框架渐渐的被淘汰了,例如:Hibe ...
- java比较字符串相等
java中String是对象类型,不能使用"=="比较.正确的用法如下: if(A.equals(B)){ //相等 }
- 一款纯css3实现的颜色渐变按钮
之前为大家分享了推荐10款纯css3实现的实用按钮,今天给大家带来一款纯css3实现的颜色渐变按钮.这款按钮的边框和文字的颜色通过css3实现两种颜色的渐变,效果非常好看,一起看下效果图: 在线预览 ...
- 纯css3实现的幽灵按钮导航
之前为大家介绍了好几款导航菜单,今天再给大家带来一款css3实现的幽灵按钮式的导航菜单.导航界面非常好看.右侧是一个css3实现的动画消息图标.效果图如下: 在线预览 源码下载 实现代码: htm ...
- Hadoop日志分析工具——White Elephant
White Elephant 是一个Hadoop日志收集器和展示器,它提供了用户角度的Hadoop集群可视化.White Elephant 是全球最大的职业社交网站Linkedin开发的一套分析Had ...
- Win2008 Server系统安装打印服务器与配置
原文:http://60808.org/thread-20259-1-1.html 视频地址:http://edu.51cto.com/lesson/id-20163.html 本文介绍的是在Win2 ...
- nginx下基于ThinkPHP框架的网站url重写
http { upstream phpfastcgi { server 127.0.0.1:9000 } } server { location / { if (!-e $request_filena ...
- 数据结构——算法之(043)(c++各种排序算法实现)
[申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出. 联系邮箱:Mr_chenping@163.com] 题目: c++ 各种排序算法实现 题目分析: 详细排序原理參考相关算法书籍 算法实现 ...
- Entity Framework管理实体关系(二):管理一对二关系
在上一篇文章中,简单的介绍了使用Fluent API如何管理一对一的实体关系,在这篇文章中,接着介绍Fluent API如何管理一对多的实体关系. 要在数据库中配置一对多关系,我们可以依赖EF约定,还 ...