2010-10-29 11 views

Antwort

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

Sie wollen wahrscheinlich 'event.getButton() == MouseEvent.BUTTON1' als auch überprüfen, nur Doppelklicks mit der linken Maustaste zählen. –

16

Angenommen, Sie in Swing bedeuten, ein Mouselistener zu Ihrer Komponente zuweisen:

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

Referenz:

14

Die e.getClickCount()==2 reicht nicht aus, wenn Sie Ihren Benutzern erlauben möchten, mit einer kurzen Verzögerung mehrere Doppelklicks auszuführen. Sie sind durch die Desktop-Konfiguration beschränkt. Sie können es, indem Sie das Ergebnis Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");

Ein guter Weg, um das Problem zu umgehen, nicht die getClickCount() Prüfung verwenden, sondern ein Timer zu verwenden, wo Sie das Intervall max zwischen Klicks können wählen, und dass man sich zu handhaben dem zählen (sehr einfach).

Der Code zugeordnet:

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

Getestet mit Win XP OS und perfekt.

+0

Intelligente Verwendung eines "Timers" zum Deaktivieren einer Flagge, komplexer als ein Vergleich zwischen zwei Zeitpunkten, aber einfacher zu verwenden. Der Nachteil, den ich sehe, ist: Wo kann ich 'isAlreadyOneClick' lagern? Scheint Probleme beim Lösen von einander zu verursachen. Diese Lösung wird auch „Löcher“ in seinem Verhalten, wenn (sie sich vor) die Klicks sind sehr schnell erledigt: jedes Mal, wenn der 'Timer' wird das Flag zurückgesetzt und nur zu diesem Zeitpunkt, wird es ein wahrer Doppelklick behandelt werden. Außerdem denke ich, dass diese Methode nicht wirklich GC- und Ressourcenfreundlich ist. – Benj

+0

Hallo Benj ich es nicht schaffen, die Beziehung zwischen der Garbage Collector und die Flagge zu verstehen. Denkst du, dass der Weg, um fortzufahren, etwas brechen kann? Könnten Sie bitte Ihr Beispiel und seine Konsequenzen präzisieren? Tut mir leid, ich sehe nicht, was Sie zu zeigen versuchen. – davidxxx

+2

Es gibt zwei Dinge, die ich zu sehen: 1/Es ist nur, dass jedes Mal, wenn der „else“ Teil des Weges laufen wird, ein neues 'Timer' Objekt erstellt wird. Ich würde diesen Timer als ein Feld des Objekts verschieben, um es von anderen Orten wie Rechtsklick oder etwas zu verwalten. 2/Bei diesen Timern wird der Doppelklick jeweils 500 ms entfernt. Wenn Sie zweimal doppelklicken müssen, besteht die Möglichkeit, dass der letzte nicht wie erwartet funktioniert. – Benj