Je veux savoir comment nous pouvons effectuer une action lorsque la souris est double-cliquée dans un composant.double clic d'identification en Java
Répondre
public void mouseClicked(MouseEvent event)
{
if (event.getClickCount() == 2) {
System.out.println("double clicked");
}
}
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:
- Java Tutoriel: How to write a Mouse Listener
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.
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
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
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
Vous devrez probablement vérifier 'event.getButton() == MouseEvent.BUTTON1' pour ne compter que les doubles-clics avec le bouton gauche de la souris. –