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

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

【问题讨论】:

    标签: java swing mouseevent double-click


    【解决方案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
              }
          }
      });
      

      参考:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-26
        • 1970-01-01
        相关资源
        最近更新 更多