2010-10-29 11 views

Respuesta

76
public void mouseClicked(MouseEvent event) 
{ 
    if (event.getClickCount() == 2) { 
    System.out.println("double clicked"); 
    } 
} 
+2

Probablemente también quiera marcar 'event.getButton() == MouseEvent.BUTTON1' para contar solo dos veces con el botón izquierdo del mouse. –

16

Suponiendo que quiere decir en Swing, asigna un MouseListener a su Componente:

addMouseListener(new MouseAdapter(){ 
    @Override 
    public void mouseClicked(MouseEvent e){ 
     if(e.getClickCount()==2){ 
      // your code here 
     } 
    } 
}); 

Referencia:

14

El e.getClickCount()==2 no es suficiente si desea permitir que sus usuarios hagan múltiples clics dobles en un breve retraso. Usted está limitado por la configuración del escritorio. Se puede conseguir examinado el resultado de Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");

Una buena manera de evitar el problema es no utilizar el cheque getClickCount() sino utilizar un Timer donde se puede elegir el máximo intervalo entre los clics y manejar por sí mismo la cuenta (muy simple).

El código asociado:

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

Probado con Win XP OS y perfecto.

+0

Uso inteligente de un 'Timer' para desarmar un indicador, más complejo que una comparación entre dos instantes pero más fácil de usar. El inconveniente que veo es: ¿dónde almacenar el 'isAlreadyOneClick'? Parece traer problemas mientras se resuelven entre sí. Esta solución también tendrá "agujeros" en su comportamiento si (imaginemos) que los clics se realizan muy rápidamente: cada vez que el 'Timer' restablecerá el indicador y solo en este momento, habrá un verdadero doble clic manejado. Además, creo que este método no es realmente GC y amigable con los recursos. – Benj

+0

Hola Benj No consigo entender la relación entre el recolector de basura y la bandera. ¿Crees que la forma de proceder puede romper algo? Por favor, ¿podría precisar más su ejemplo y sus consecuencias? Lo siento, no veo lo que intenta mostrar. – davidxxx

+2

Hay dos cosas que veo: 1/Es solo que cada vez que se ejecuta la parte "else", se creará un nuevo objeto 'Timer'. Me gustaría mover este temporizador como un campo del objeto para permitir su gestión desde otros lugares como el clic derecho o algo así. 2/Estos temporizadores desangrarán su doble clic cada 500ms, luego si tiene que hacer doble clic dos veces, hay posibilidades de que el último no funcione como se esperaba. – Benj

Cuestiones relacionadas