2009-02-14 19 views
15

¿alguien puede pensar en una buena forma de ignorar el solo clic que viene con un doble clic en Java?Java: ignorar un solo clic con doble clic?

Busco tener comportamientos diferentes para cada forma que:

  • un solo clic pinta punto de mira en el punto de clic
  • doble clic selecciona un objeto en la pantalla, sino que debe no pintar puntos de mira en el punto de clic

... ¿alguien puede pensar en una forma de hacerlo? Algún tipo de configuración de temporizador tal vez? Una idea apreciada :-)

< descargo de responsabilidad> ... y sí, sé que estoy cometiendo un error de usabilidad/UI faux pas. </descargo de responsabilidad>

editar # 2:

A pesar de que esto funciona el retraso debido a que el temporizador es enloquecedor - Estoy abandonando esta solución, y utilizando el botón del medio para la selección en lugar de hacer doble clic ...

EDIT:

Gracias cgull - esto es lo que yo era capaz de llegar a dado su confirmación de que no hay manera fácil de hacer esto (tenga en cuenta que si fijo el temporizador < 200 carreras de extraña se observa entre el clic & el temporizador, pero siempre y cuando voy a poner esto en un valor> 200 cosas funcionan igual color de rosa):

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(); 
    } 
} 
+0

cómo puede funcionar esto? wasDoubleClick no puede ser final, y se usa dentro de otra clase (el ActionListener anónimo) – alessiop86

Respuesta

16

De hecho, necesitará configurar un temporizador en su método reemplazado por mouse() de mouseAdapter para detectar el intervalo de tiempo entre los dos clics. El intervalo predeterminado en ms se puede encontrar consultando Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval"). Si se detecta otro clic en el mouse antes de que el temporizador expire, entonces tiene un doble clic, de lo contrario, una vez que el temporizador caduque, puede procesar el solo clic.

0

Ha intentado implementar la interfaz MouseListener ya?

Creo que MouseEvent tiene un método de recuento de clics (o propiedad) para saberlo.

Apuesto a que ya has pasado por eso, ¿cuál es el problema que estás enfrentando allí?

Probablemente lo que puede hacer es codificar el intervalo de tiempo transcurrido entre un simple y doble clic con un hilo o algo.

Por lo tanto, un solo clic solo será válido si no se emite otro clic, digamos 300 ms. (Algo configurable)

La idea es:

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 

O algo por el estilo.

0

Una solución alternativa:

me di cuenta de esto antes de encontrar la solución en esta cuestión.La idea es la misma, usa un temporizador, aunque es más complicado :).

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

} 

En mouseClicked() método que se puede hacer algo como esto:

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 
} 

espero que sea útil.

2

En realidad creo que no hay una solución más simple (usar (método) de 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(); 
     } 

    } 
} 
Cuestiones relacionadas