识别java中的双击

Posted

技术标签:

【中文标题】识别java中的双击【英文标题】:identifying double click in java 【发布时间】:2011-05-02 09:17:49 【问题描述】:

我想知道当鼠标在组件中双击时我们如何执行操作。

【问题讨论】:

【参考方案1】:
public void mouseClicked(MouseEvent event)

  if (event.getClickCount() == 2 && event.getButton() == MouseEvent.BUTTON1) 
    System.out.println("double clicked");
  

【讨论】:

您可能还想检查event.getButton() == MouseEvent.BUTTON1,只计算鼠标左键的双击次数。 @SeanVanGorder 或SwingUtilities.isLeftMouseButton(event)【参考方案2】:

我的问题是,如果用户单击,我必须以一种方式响应,如果他们单击多次,则必须以另一种方式响应(当我多次单击时,我的 Swing VM 似乎最多可以计数四次单击)。当我运行上面的示例时,它似乎将三次单击计为一次单击。所以,这是我的重写。基本上,我只有一个计划任务,等待灰尘清除,然后检查注册的点击次数。 400 毫秒的等待似乎对我来说效果最好。

JButton jButton = new JButton("Click Me!");
jButton.addMouseListener(new MouseAdapter() 
    private int eventCnt = 0;
    java.util.Timer timer = new java.util.Timer("doubleClickTimer", false);

    @Override
    public void mouseClicked(final MouseEvent e) 
        eventCnt = e.getClickCount();
        if ( e.getClickCount() == 1 ) 
            timer.schedule(new TimerTask() 
                @Override
                public void run() 
                    if ( eventCnt == 1 ) 
                        System.err.println( "You did a single click.");
                     else if ( eventCnt > 1 ) 
                        System.err.println("you clicked " + eventCnt + " times.");
                    
                    eventCnt = 0;
                
            , 400);
        
    
);

【讨论】:

【参考方案3】:

如果您想让您的用户在短时间内执行多次双击,e.getClickCount()==2 是不够的。 您受到桌面配置的限制。 你可以通过查看Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");的结果得到它

绕过该问题的一个好方法是不使用getClickCount() 检查,而是使用Timer,您可以在其中选择点击之间的最大间隔并自行处理计数(非常简单)。

相关代码:

boolean isAlreadyOneClick;

@Override
public void mouseClicked(MouseEvent mouseEvent) 
    if (isAlreadyOneClick) 
        System.out.println("double click");
        isAlreadyOneClick = false;
     else 
        isAlreadyOneClick = true;
        Timer t = new Timer("doubleclickTimer", false);
        t.schedule(new TimerTask() 

            @Override
            public void run() 
                isAlreadyOneClick = false;
            
        , 500);
    

用 Win Xp 操作系统测试,完美。

【讨论】:

智能使用Timer 取消设置标志,比两个瞬间之间的比较更复杂,但更易于使用。我看到的缺点是:在哪里存储 isAlreadyOneClick ?似乎在解决彼此的同时也带来了问题。如果(让我们想象一下)点击完成得非常快,这个解决方案的行为也会有“漏洞”:每次Timer 将重置标志,只有在这个时候,才会处理真正的双击。另外,我认为这种方法对 GC 和资源并不友好。 您好 Benj 我无法理解垃圾收集器和标志之间的关系。您认为继续进行的方式会破坏某些东西吗?请问,您能否进一步说明您的示例及其后果?抱歉,我没看到你想显示的内容。 我看到了两件事: 1/ 只是每次遇到“else”部分时,都会创建一个新的Timer 对象。我会将这个计时器作为对象的一个​​字段移动,以允许从其他位置(例如右键单击或其他位置)对其进行管理。 2/ 这些计时器每 500 毫秒将取消标记您的双击,然后如果您必须双击两次,则最后一次可能无法按预期工作。 不是很清楚,请原谅 :) 但是如果用户不是偷偷摸摸的,你的代码是正确的;) 你相信这个......这么低质量的问题......而且比我的任何人都支持更多。 hrmpf.【参考方案4】:

假设你的意思是在 Swing 中,为你的组件分配一个 MouseListener:

addMouseListener(new MouseAdapter()
    @Override
    public void mouseClicked(MouseEvent e)
        if(e.getClickCount()==2)
            // your code here
        
    
);

参考:

Java 教程:How to write a Mouse Listener

【讨论】:

以上是关于识别java中的双击的主要内容,如果未能解决你的问题,请参考以下文章

检测Java Swing中的双击

如何识别iOS中的单个单击和双击视图?

图像识别技术在骨质疏松诊断中的应用

我可以处理 UITabbarController 中的双击吗

如何加速识别单击而不是双击?

如何检测 QTableView 中的双击