2010-10-29 34 views

Répondre

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

Vous devrez probablement vérifier 'event.getButton() == MouseEvent.BUTTON1' pour ne compter que les doubles-clics avec le bouton gauche de la souris. –

16

En supposant que vous voulez dire Swing, attribuez un MouseListener à votre composant:

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

Référence:

14

Le e.getClickCount()==2 n'est pas suffisant si vous voulez permettre à vos utilisateurs de faire plusieurs double-clics dans un court délai. Vous êtes limité par la configuration du bureau. Vous pouvez l'obtenir en regardant le résultat de Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");

Une bonne façon de contourner le problème est de ne pas utiliser le chèque getClickCount() mais d'utiliser un Timer où vous pouvez choisir l'intervalle maximum entre vos clics et gérer soi-même la compte (très simple).

Le code associé:

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

Testé avec Win XP OS et parfait.

+0

Utilisation intelligente d'un 'Timer' pour désactiver un drapeau, plus complexe qu'une comparaison entre deux instants mais plus facile à utiliser. L'inconvénient que je vois est: où stocker le 'isAlreadyOneClick'? Semble apporter des problèmes tout en se résolvant les uns les autres. Cette solution aura également des "trous" dans son comportement si (imaginons) les clics se font très rapidement: à chaque fois que le "Timer" remettra à zéro le drapeau et seulement à ce moment, il y aura un double clic géré. Aussi, je pense que cette méthode n'est pas vraiment compatible GC et ressources. – Benj

+0

Bonjour Benj Je n'arrive pas à comprendre la relation entre le Garbage Collector et le drapeau. Pensez-vous que la façon de procéder peut casser quelque chose? Pourriez-vous préciser votre exemple et ses conséquences? Désolé, je ne vois pas ce que vous essayez de montrer. – davidxxx

+2

Il y a deux choses que je vois: 1/C'est juste que chaque fois que la partie "else" sera exécutée, un nouvel objet 'Timer' sera créé. Je voudrais déplacer cette minuterie comme un champ de l'objet pour permettre de le gérer à partir d'autres endroits tels que le clic droit ou un peu. 2/Ces minuteries ne flambent pas votre double clic toutes les 500ms, alors si vous double cliquez deux fois, il y a des chances que la dernière ne fonctionne pas comme prévu. – Benj