【问题标题】:Java : ignore single click on double click?Java:忽略单击双击?
【发布时间】:2010-10-07 14:02:06
【问题描述】:

谁能想到一个好方法来忽略 Java 中的双击带来的单击?

我希望每个人都有不同的行为:

  • 单击在点击点上绘制十字准线
  • 双击选择屏幕上的一个对象,但应该在点击点上绘制十字准线

...谁能想到办法做到这一点?某种计时器设置可能吗?一个想法表示赞赏:-)

...是的,我知道我犯了一个最令人发指的可用性/用户界面失礼。 免责声明>

编辑#2:

即使这样有效,由于计时器导致的延迟令人抓狂 - 我放弃了这个解决方案,并使用中键单击而不是双击进行选择...

编辑:

感谢cgull - 这是我能够提出的,因为您确认没有简单的方法可以做到这一点(请注意,如果我将计时器设置为 200 的值,一切都会正常工作):

public void mouseClicked(MouseEvent e) {
    System.out.println( "Click at (" + e.getX() + ":" + e.getY() + ")" );
    if (e.getClickCount() == 2) {  
        System.out.println( "  and it's a double click!");
        wasDoubleClick = true;
    }else{
        Integer timerinterval = (Integer) 
          Toolkit.getDefaultToolkit().getDesktopProperty(
                      "awt.multiClickInterval");
        timer = new Timer(timerinterval.intValue(), new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                if (wasDoubleClick) {
                    wasDoubleClick = false; // reset flag
                } else {
                    System.out.println( "  and it's a simple click!");
                }
            }    
        });
        timer.setRepeats(false);
        timer.start();
    }
}

【问题讨论】:

  • 这如何工作? wasDoubleClick 不能是最终的,它在另一个类(匿名 ActionListener 类)中使用

标签: java events click mouse double-click


【解决方案1】:

确实,您需要在 MouseAdapter 的覆盖 mouseClicked() 方法中设置一个 Timer 来检测两次单击之间的时间间隔。默认时间间隔ms可以通过查询找到 Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval")。如果在计时器到期之前检测到另一次鼠标单击,则您可以双击,否则一旦计时器到期,您可以处理单击。

【讨论】:

    【解决方案2】:

    其实我觉得有一个更简单的解决方案(使用InputEvent的getWhen()方法):

    class DCListener extends MouseAdapter{
    
        private long maxTimeBetweenClicks; // in millis
        private long firstClickTime=0;
        private Runnable eventHandler;
    
        public DCListener(long maxTimeBetweenClicks,Runnable eventHandler){
            this.maxTimeBetweenClicks=maxTimeBetweenClicks;
            this.eventHandler=eventHandler;
        }
    
        public void mouseClicked(MouseEvent e){
    
            if((e.getWhen()-firstClickTime)<=maxTimeBetweenClicks){
                firstClickTime=0; // 3 clicks are not 2 double clicks
                eventHandler.run();
            }else{
                firstClickTime=e.getWhen();
            }
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      您是否已经尝试过实现 MouseListener 接口?

      我认为 MouseEvent 有一个点击计数方法(或属性)可以知道这一点。

      我敢打赌你已经经历过了,那么你面临的问题是什么?

      您可以做的可能是使用线程或其他东西对单击和双击之间经过的时间间隔进行编码。

      因此,仅当在 300 毫秒内未发出另一次点击时,一次点击才有效。 (可配置的东西)

      想法是:

      public void listen for the single click() 
          if (  in x time there has not been another click  ) 
          then 
              we have a single click
              proceed with your single click handling
          else 
              we have a double click
             proceed with your double click handling
      

      或者类似的东西。

      【讨论】:

        【解决方案4】:

        另一种解决方案:

        在我找到这个问题的解决方案之前,我已经想通了。想法是一样的,使用计时器,虽然更复杂:)。

        使用SwingWorker:

        class BackgroundClickHandler extends SwingWorker<Integer, Integer> {
          @Override
          protected Integer doInBackground() throws Exception {
            Thread.sleep(200);
            // Do what you want with single click
            return 0;
          }
        
        }
        

        mouseClicked() 方法中,您可以执行以下操作:

         if (event.getClickCount() == 1) {
          // We create a new instance everytime since
          // the execute() method is designed to be executed once
          clickHandler = new BackgroundClickHandler();
        
          try {
            clickHandler.execute();
          } catch(Exception e) {
            writer.println("Here!");
          }
        }
        
        if (event.getClickCount() == 2) {
          clickHandler.cancel(true);
        
          //Do what you want with double click
        }
        

        希望对你有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-16
          相关资源
          最近更新 更多