1. import java.awt.Toolkit;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import java.awt.MouseAdapter;
  5. import java.awt.MouseEvent;
  6. public class MyMouseClickListener extends MouseAdapter implements MouseListener{
  7. // 取得当前操作系统的双击时间长度参数
  8. private final static int MULTI_CLICK_INTERVAL = Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");
  9. private MouseEvent lastEvent;
  10. private Timer timer;
  11. private int mouseButtonNumber = -1;
  12. public MyMouseClickListener(){
  13. this(MULTI_CLICK_INTERVAL);
  14. }
  15.  
  16. public MyMouseClickListener(int delay){
  17. // 初始化一个计数器。这个计数器在启动以后,经过delay长的时间,自动停止。
    this.timer = new Timer(delay,this);
  18. }
  19.  
  20. @override
  21. public void mouseClicked(MouseEvent e){
  22. if(e.getClickCount > 2){
  23. return;
  24. }
  25. lastEvent = e;
  26.  
  27. // 如果计时器还在运行,且上次鼠标是左键点击,且本次点击也是左键点击,则视为合法左键双击。
  28. if(timer.isRunning() && mouseButtonNumber == MouseEvent.BUTTON1 && e.getButton == MouseEvent.BUTTON1){
    timer.stop();
  29. doubleClicked(lastEvent);
  30. }else{
    timer.restart();
    mouseButtonNumber = e.getButton();
    }
  31. }

  32. /*
    * 单击以后的处理,自行覆盖
    */
  33. public void singleClicked(MouseEvent e){
  34.  
  35. }

  36. /*
    * 双击以后的处理,自行覆盖编写
    */
  37. public void doubleClicked(MouseEvent e){
  38.  
  39. }
  40.  
  41. @override
  42. public void actionPerformed(ActionEvent e){
    timer.stop();
  43. singleClicked(lastEvent);
  44. }
  45. }

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修饰。

  1. public class MyTableMouseClickListener extends MyMouseClickListener{
  2. protected JTable table1 = null;
  3. protected int line = -1;
  4.  
  5. @override
  6. public void mouseClicked(MouseEvent e){
  7.  
  8. if(e.getClickCount() == 1){
  9. table1 = (JTable)(e.getSource());
  10. line = table1.getSelectedRow();
  11. timer.restart();
  12. mouseButtonNumber = e.getButton();
  13. return;
  14. }
  15. if(e.getClickCount() > 2){
  16. return;
  17. }
  18. JTable table2 = (JTable)(e.getSource());
  19. if((null == table1 || table2 != table1) || table2.getSelectedRow{} != line){
  20. return;
  21. }
  22. lastEvent = 2;
  23. if(timer.isRunning() && mouseButtonNumber == MouseEvent.BUTTON1 && e.getButton() == MouseEvent.BUTTON1){
  24. timer.stop();
  25. doubleClicked(lastEvent);
  26. }
  27. }
  28. }

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

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

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

Swing中如何比较好的判断鼠标左键双击的更多相关文章

  1. JavaScript经典代码【二】【javascript判断用户点了鼠标左键还是右键】

    IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0 默认.没有按任何按钮. events.b ...

  2. zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法

    转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...

  3. [Eclipse] eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件【待解决】

    eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件: 1. 设置eclipse ctrl + 左键打开源文件代码,如下图,设置都正常 2. 在网上找了很多种办法,均失败,在 ...

  4. Eclipse 中 ctrl+鼠标左键 快捷查看资源失效

    Eclipse 中 ctrl+鼠标左键 快捷查看资源失效 看看eclipse 工作空间配置的jdk是什么版本,看看本地环境变量中的jdk是什么版本,将二者的版本统一即可. 笔者从git上clone一个 ...

  5. C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框

    最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...

  6. 【转】 js怎么区分出点击的是鼠标左键还是右键?

    IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0  默认.没有按任何按钮. events. ...

  7. delphi Ctrl+鼠标左键或者Find Declaration不能定位到源文件

    在Delphi代码编辑器中使用Ctrl+鼠标左键可跳转到鼠标下的类所在的定义处,但今天发现一个奇怪的问题,EhLib组件的类无法跳转(包括uses中的pas文件),重新安装也是如此,后来经过验证,发现 ...

  8. USB 驱动(监测鼠标左键的动作)

    (基于 Linux 3.4.2 内核) 可分为以下几个步骤来完成这个驱动: 1. 分配设置一个 usb_driver 结构体 2. 注册这个 usb_driver (如果设备的 id_table 与驱 ...

  9. Winform 基础二 最小化 最大化 关闭 点击任务栏隐藏显示 点击鼠标左键移动窗体

    一 最大化 二 最小化 三 关闭 四 点击任务栏隐藏显示 五 点击鼠标左键移动窗体 六 阴影效果鼠标左键移动窗口 #region UI设置 最大化.最小化.关闭.鼠标移动窗口.点击任务栏切换窗口 th ...

随机推荐

  1. ie浏览器不兼容css媒体查询的解决办法

    有些页面布局复杂,在不同分辨率下表现需要一致,这时需要用媒体查询根据不同分辨率进行百分比定位(不能用像素定位),如: @media screen and (max-width: 1600px) { . ...

  2. jquery50个代码段

    1. 如何创建嵌套的过滤器 ? 1 //允许你减少集合中的匹配元素的过滤器, //只剩下那些与给定的选择器匹配的部分.在这种情况下, //查询删除了任何没(:not)有(:has) //包含class ...

  3. shell关于日期的加减

    $cat sh.sh #!/bin/bash ] ; then ydate=`date -d -1days "+%Y%m%d"` ydateother=`date -d -1day ...

  4. 基于jquery带时间轴的图片轮播切换代码

    基于jquery图片标题随小圆点放大切换.这是是一款带时间轴的图片轮播切换代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id="decoroll2 ...

  5. spring session实现集群中session共享

    本文转自:http://dorole.com/1422/ 使用框架的会话管理工具,也就是本文要说的spring-session,可以理解是替换了Servlet那一套会话管理,既不依赖容器,又不需要改动 ...

  6. 【C#】Queue的简单试用

    新建一个WPF项目,测试C#的Queue类的简单使用. 前台准备两个按钮 MainWindow.xaml <StackPanel VerticalAlignment="Center&q ...

  7. C语言 · 新建Microsoft Word文档

    算法提高 新建Microsoft Word文档   时间限制:1.0s   内存限制:256.0MB      问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出的题 ...

  8. Liunx下NFS服务器的搭建与配置

    一.NFS简介 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NF ...

  9. Drupal的目录结构

    ①.includes 文件夹 存放Drupal程序头文件. Drupal的一些函数和变量的定义,均可在此文件夹下的文件中找到.这 些文件都是以.inc结尾的. ②.misc文件夹 Drupal所用的其 ...

  10. FastDFS 安装步骤

    nginx01        121nginx02        122 tracker01      131tracker02      132 storage01      141storage0 ...