web-dev-qa-db-fra.com

identifier le double clic dans java

Je veux savoir comment effectuer une action lorsque la souris est double-cliquée dans un composant.

48
Suraj Air
public void mouseClicked(MouseEvent event)
{
  if (event.getClickCount() == 2) {
    System.out.println("double clicked");
  }
}
81
kaliatech

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:

20
Sean Patrick Floyd

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.

17
davidxxx

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);
        }
    }
});
0
Warren Weis