2009-02-14 8 views
15

Quelqu'un peut-il penser à un bon moyen d'ignorer le simple clic qui vient avec un double-clic en Java?Java: ignorer un simple clic sur un double clic?

Je suis à la recherche d'avoir des comportements différents pour chacun tel que:

  • un seul clic peint réticules sur le point de clic
  • double clic sélectionne un objet sur l'écran, mais ne devrait pas peinture réticule sur le point de clic

... Quelqu'un peut-il penser à un moyen de faire cela? Une sorte d'installation de minuterie peut-être? Une idée appréciée :-)

< avertissement> ... et oui, je sais que je commets une usabilité la plus odieuse/faux pas de l'interface utilisateur. </disclaimer>

EDIT # 2:

Même si cela fonctionne le retard dû à la minuterie est affolant - j'abandonne cette solution, et en utilisant le clic du milieu pour la sélection au lieu de double-cliquez sur ...

EDIT:

Merci cgull - ce que j'ai pu trouver donné la confirmation qu'il n'y a aucun moyen facile de faire cela (notez que si je mets la minuterie < 200 course impair est vu entre le clic & la minuterie, mais aussi longtemps que je ceci à une valeur> 200 choses fonctionnent Peachy):

public void mouseClicked(MouseEvent e) { 
    System.out.println("Click at (" + e.getX() + ":" + e.getY() + ")"); 
    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(); 
    } 
} 
+0

comment peut-il fonctionner? wasDoubleClick ne peut pas être final, et il est utilisé dans une autre classe (l'ActionListener anonyme) – alessiop86

Répondre

16

En effet, vous aurez besoin de configurer un minuteur dans votre méthode mouseClicked() substituée de votre MouseAdapter pour détecter l'intervalle de temps entre les deux clics. L'intervalle par défaut en ms peut être trouvé en interrogeant Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval"). Si un autre clic de souris est détecté avant l'expiration de la minuterie, alors vous double-cliquez dessus, sinon, une fois le minuteur expiré, vous pouvez traiter le simple clic.

0

Avez-vous essayé la mise en œuvre déjà l'interface MouseListener?

Je pense que MouseEvent a une méthode de comptage de clics (ou une propriété) pour le savoir.

Je parie que vous avez déjà vécu cela, alors quel est le problème auquel vous êtes confronté?

Probablement ce que vous pouvez faire est de coder l'intervalle de temps écoulé entre un simple et un double-clic avec un fil ou quelque chose.

Donc, un seul clic ne sera valide que si un autre clic n'est pas émis, disons 300 ms. (Quelque chose configurable)

L'idée est:

public void listen for the single click() 
    if ( in x time there has not been another click ) 
    then 
     we have a single click 
     proceed with your single click handling 
    else 
     we have a double click 
     proceed with your double click handling 

Ou quelque chose comme ça.

0

Une solution alternative:

je me suis dit ce avant que je trouve la solution dans cette question.L'idée est la même, utilisez une minuterie, bien que plus compliquée :).

Utilisation SwingWorker:

class BackgroundClickHandler extends SwingWorker<Integer, Integer> { 
    @Override 
    protected Integer doInBackground() throws Exception { 
    Thread.sleep(200); 
    // Do what you want with single click 
    return 0; 
    } 

} 

Dans mouseClicked() la méthode que vous pouvez faire quelque chose comme ceci:

if (event.getClickCount() == 1) { 
    // We create a new instance everytime since 
    // the execute() method is designed to be executed once 
    clickHandler = new BackgroundClickHandler(); 

    try { 
    clickHandler.execute(); 
    } catch(Exception e) { 
    writer.println("Here!"); 
    } 
} 

if (event.getClickCount() == 2) { 
    clickHandler.cancel(true); 

    //Do what you want with double click 
} 

J'espère que ce soit utile.

2

En fait, je pense qu'il ya une solution plus simple (méthode utiliser getWhen() de InputEvent):

class DCListener extends MouseAdapter{ 

    private long maxTimeBetweenClicks; // in millis 
    private long firstClickTime=0; 
    private Runnable eventHandler; 

    public DCListener(long maxTimeBetweenClicks,Runnable eventHandler){ 
     this.maxTimeBetweenClicks=maxTimeBetweenClicks; 
     this.eventHandler=eventHandler; 
    } 

    public void mouseClicked(MouseEvent e){ 

     if((e.getWhen()-firstClickTime)<=maxTimeBetweenClicks){ 
      firstClickTime=0; // 3 clicks are not 2 double clicks 
      eventHandler.run(); 
     }else{ 
      firstClickTime=e.getWhen(); 
     } 

    } 
} 
Questions connexes