views:

2604

answers:

2

Hiya - 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:

  • single-click paints crosshairs on the click point
  • double-click selects an object on the screen, but should not paint crosshairs on the click point

... can anyone think of a way to do this ? Some sort of timer set-up maybe ? An ideas appreciated :-)

<disclaimer> ...and yes, I know I'm committing a most heinous usability / UI faux pas. </disclaimer>

EDIT #2:

Even though this works the delay due to the timer is maddening - I'm abandoning this solution, and using middle-click for selection instead of double-click...

EDIT:

Thanks cgull - this is what I was able to come up with given your confirmation that there's no easy way to do this (note that if I set the timer < 200 odd racing is seen between the click & the timer, but as long as I set this to a value > 200 things work just peachy) :

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();
 }
}
A: 

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.

OscarRyz
+5  A: 

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.

cgull