2011-01-02 33 views
11

que busco el foro y ver este códigos:Distinguir entre un solo clic y doble clic en Java

  public void mouseClicked(MouseEvent e) { 
      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(); 
      } 

     } 

pero el código se ejecuta de forma incorrecta (en algún momento se imprime "y es un solo clic!" 2 veces . Debería imprimir "¡y es un doble clic!"). ¿Alguien puede mostrarme por qué? o puedes darme algunas formas mejores de hacer esto? ¡Gracias!

+0

¿Puedo ASK ¿qué es exactamente el código anterior tratando de lograr? es decir, ¿para qué sirve esta aplicación? quiero tener una mejor idea de lo que estás tratando de lograr. –

+0

Relacionado (referencia): http://stackoverflow.com/questions/548180/java-ignore-single-click-on-double-click?rq=1 – Jayan

Respuesta

17

En algún momento se imprime "y es un solo clic!" 2 veces . Debe imprimir "¡y es un doble clic!").

Eso es normal. Solo debe hacer doble clic si hace clic dos veces dentro del intervalo de tiempo especificado. Entonces, a veces, si no hace clic lo suficientemente rápido obtendrá dos clics individuales seguidos.

Integer timerinterval = (Integer) Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval"); 

La línea de código anterior determina qué tan rápido debe ser el doble clic.

Por lo que vale aquí es un código que he usado para hacer lo mismo. No sé si es mejor o peor que el código tiene:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class ClickListener extends MouseAdapter implements ActionListener 
{ 
    private final static int clickInterval = (Integer)Toolkit.getDefaultToolkit(). 
     getDesktopProperty("awt.multiClickInterval"); 

    MouseEvent lastEvent; 
    Timer timer; 

    public ClickListener() 
    { 
     this(clickInterval); 
    } 

    public ClickListener(int delay) 
    { 
     timer = new Timer(delay, this); 
    } 

    public void mouseClicked (MouseEvent e) 
    { 
     if (e.getClickCount() > 2) return; 

     lastEvent = e; 

     if (timer.isRunning()) 
     { 
      timer.stop(); 
      doubleClick(lastEvent); 
     } 
     else 
     { 
      timer.restart(); 
     } 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     timer.stop(); 
     singleClick(lastEvent); 
    } 

    public void singleClick(MouseEvent e) {} 
    public void doubleClick(MouseEvent e) {} 

    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("Double Click Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.addMouseListener(new ClickListener() 
     { 
      public void singleClick(MouseEvent e) 
      { 
       System.out.println("single"); 
      } 

      public void doubleClick(MouseEvent e) 
      { 
       System.out.println("double"); 
      } 
     }); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
    } 
} 
+0

La velocidad de doble clic para Ubuntu Linux fue tan rápida que no pude usarla (cuando me concentré en tratar de hacer un doble clic lo suficientemente rápido, el mouse a menudo se movía ligeramente, produciendo dos clics). Por esa razón, evitaría usar acciones basadas en eventos de doble clic, si es práctico. –

+2

Un buen punto sobre el movimiento del mouse de un píxel o dos que hace que el recuento de clics se restablezca. En general, tampoco recomiendo este enfoque, ya que nunca debería ignorar un solo clic. El clic simple debe usarse para "seleccionar" algo y luego se usa el doble clic para realizar y "acción" en el elemento seleccionado. La clase que publiqué te permite controlar la velocidad de doble clic para que sea más útil si lo deseas. – camickr

+3

(posiblemente, por supuesto :-) no debe interferir con el comportamiento generado por el sistema operativo: distinguir el doble frente al único es la tarea del sistema subyacente. Si eso decide, no es un doble clic, ya sea. De lo contrario, los usuarios tienen que ajustar su comportamiento de velocidad de clic por aplicación – kleopatra

0
public void mouseClicked(MouseEvent evt) { 
    if (evt.getButton()==MouseEvent.BUTTON1){ 
    leftClick = true; clickCount = 0; 
    if(evt.getClickCount() == 2) doubleClick=true; 
    Integer timerinterval = (Integer)Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval"); 

       timer = new Timer(timerinterval, new ActionListener() { 
       public void actionPerformed(ActionEvent evt) { 
        if(doubleClick){ 
         System.out.println("double click."); 
         sb = new StringBuffer(); 
         sb.append("Double Click"); 
         clickCount++; 
         if(clickCount == 2){        
          clickCount=0; 
          doubleClick = false; 
         } 

        } else { 

         sb = new StringBuffer(); 
         sb.append("Left Mouse"); 
         System.out.println("single click.");       
        } 
       }    
      }); 
      timer.setRepeats(false); 
      timer.start(); 
      if(evt.getID()==MouseEvent.MOUSE_RELEASED) timer.stop(); 
}   
+0

@Aptos Espero que mi código te ayude. ¡¡¡Buena suerte!!! :) – Anonymous

+0

@ Juno - Me doy cuenta de que este hilo tiene casi un año, así que tal vez ni siquiera debería preguntar ... pero ¿no imprime tu código "doble clic"? dos veces cuando el usuario hace doble clic? No sé si esa fue tu intención o las implicaciones de la situación. Simplemente no parece eficiente, pero seguramente me esté perdiendo el sentido. – DSlomer64

+0

@ DSlomer64 Gracias por su comentario. Ese puede ser mi error. Probé los eventos de clic del mouse para mi proyecto que deben capturarse cuando el evento de un solo clic se realiza o hace doble clic en occour. System.out.print está probando el evento click. sb.append ("") son los requisitos de mi proyecto. Lo que sea que te agradece – Anonymous

Cuestiones relacionadas