Je veux savoir comment effectuer une action lorsque la souris est double-cliquée dans un composant.
public void mouseClicked(MouseEvent event)
{
if (event.getClickCount() == 2) {
System.out.println("double clicked");
}
}
En supposant que vous vouliez dire dans Swing, affectez un MouseListener à votre composant:
addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e){
if(e.getClickCount()==2){
// your code here
}
}
});
Référence:
La fonction e.getClickCount()==2
ne suffit pas si vous souhaitez autoriser vos utilisateurs à effectuer plusieurs doubles 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");
Un bon moyen de contourner le problème n'est pas d'utiliser la vérification getClickCount()
mais d'utiliser un Timer
où vous pouvez choisir l'intervalle max entre vos clics et gérer par vous-même le nombre (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.
Mon problème est que je dois répondre d'une manière si l'utilisateur clique une fois, une autre s'il clique plus d'une fois (mon Swing VM semble pouvoir compter jusqu'à quatre clics lorsque je clique sur plusieurs fois). Lorsque j'ai exécuté l'exemple ci-dessus, il semblait compter un triple clic comme un seul. Donc, voici ma réécriture. En gros, j'ai juste une tâche planifiée qui attend que la poussière se dissipe, puis vérifie le nombre de clics enregistrés. L'attente de 400 ms semble fonctionner le mieux pour moi.
JButton jButton = new JButton("Click Me!");
jButton.addMouseListener(new MouseAdapter() {
private int eventCnt = 0;
Java.util.Timer timer = new Java.util.Timer("doubleClickTimer", false);
@Override
public void mouseClicked(final MouseEvent e) {
eventCnt = e.getClickCount();
if ( e.getClickCount() == 1 ) {
timer.schedule(new TimerTask() {
@Override
public void run() {
if ( eventCnt == 1 ) {
System.err.println( "You did a single click.");
} else if ( eventCnt > 1 ) {
System.err.println("you clicked " + eventCnt + " times.");
}
eventCnt = 0;
}
}, 400);
}
}
});