Java : ignore single click on double click?

后端 未结 4 1332
名媛妹妹
名媛妹妹 2020-12-29 09:00

can anyone think of a good way to ignore the single click that comes with a double-click in Java ?

I\'m looking to have different behaviors for each such that:

相关标签:
4条回答
  • 2020-12-29 09:16

    Actually I think there is a simpler solution (use InputEvent's getWhen() method):

    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();
            }
    
        }
    }
    
    0 讨论(0)
  • 2020-12-29 09:27

    Have you tried implementing the MouseListener interface already?

    I think MouseEvent has a click count method ( or property ) to know that.

    I bet you have gone through that already, so what is the problem you're facing there?

    Probably what you can do is to code the time interval elapsed between a single and a double click with a thread or something.

    So a single click will only be valid if another click is not issued in let's say 300 ms. ( something configurable )

    The idea is:

    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
    

    Or something like that.

    0 讨论(0)
  • 2020-12-29 09:30

    Indeed you'll need to set up a Timer in your overridden mouseClicked() method of your MouseAdapter to detect the time interval between the two clicks. The default interval in ms can be found by querying Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval"). If another mouse click is detected before the timer expires, then you have a double-click, else once the timer expires, you can process the single-click.

    0 讨论(0)
  • 2020-12-29 09:31

    An alternative solution:

    I figured out this before I found the solution in this question. The idea is the same, use a timer, although more complicated :).

    Use 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;
      }
    
    }
    

    In mouseClicked() method you can do something like this:

     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
    }
    

    I hope it be useful.

    0 讨论(0)
提交回复
热议问题