zoukankan      html  css  js  c++  java
  • 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的问题。

  • 相关阅读:
    场曲——像差相关
    曲面探测器相关——查资料
    光学系统联合设计
    Python3:Django连接Mysql数据库时出错,'Did you install mysqlclient or MySQL-python?'
    Python3.x:pip install pymssql安装时出错
    Python3:自动发送账单邮件
    Python3:input()输入函数的用法
    Python3:读取配置dbconfig.ini(含有中文)显示乱码的解决方法
    python3:利用smtplib库和smtp.qq.com邮件服务器发送邮件
    CSS3:布局display属性的flex(弹性布局)
  • 原文地址:https://www.cnblogs.com/mabaishui/p/3594352.html
Copyright © 2011-2022 走看看