# Wie Doppelklick und Einfachklick unterscheiden?



## it-girl (19. Aug 2011)

Hallo zusammen,

in meinem Programm möchte ich gerne einen Doppelklick von einem Einfachklick unterscheiden. Ich habe schon oft diese Lösung gefunden:

```
public void mouseClicked(MouseEvent m) {
	int clicks = m.getClickCount();
	if (clicks == 1) {
		System.out.println("Einfachklick");
	}
	if (clicks >= 2) {
		System.out.println("Doppelklick");
	}
}
```

Das funktioniert zwar, aber leider nicht so, wie ich mir das vorstelle...
Denn hier wird bei einem Doppelklick ausgegeben:

```
Einfachklick
Doppelklick
```
Aber ich möchte gerne, dass da nur "Doppelklick" raus kommt.
Bei meinem Programm soll es bei einem Einfachklick auf einen Knoten meinen Graphen neu lädt und bei einem Doppelklick soll das Dokument geöffnet werden, für das der Knoten steht.
(Ich hoffe, das war verständlich?)

Weiß jemand von euch, wie ich das machen kann?

Vielen Dank schon mal für eure Hilfe!

LG
IT-girl


----------



## Camino (19. Aug 2011)

Na ja, auch bei einem Doppelklick hast du zuerst einen einfachen Klick, der registriert wird. Nimm doch einfach die Abfrage nach dem Einfachklick raus und frage nur ab, ob zweimal geklickt wurde. Wenn du nur dden Zweifachklick brauchst.


----------



## bERt0r (19. Aug 2011)

Das wird nicht ganz einfach, du könntest bei mouseClicked einen Tread benachrichtigen, welcher nach jedem Klick ein paar Millisekunden (je nach Doppelklickgeschwindigkeit) schläft und dann je nach Click count die gewünschte Operation durchführt.
Z.B Doppelklick kommt
-> Erster Klick MouseEvent clickcount=1
Thread schläft 100 ms und will nachher Aktion 1 ausführen
-> Zweiter Klick MouseEvent clickcount=2
Thread wird interrupted und führt Aktion 2 aus


----------



## Marco13 (19. Aug 2011)

Ich denke es ging darum, dass bei einem Einfachklick etwas passieren sollte, was aber bei einem Doppelklick NICHT passieren sollte. Aber so ist das eben: Ein Doppelklick ist ein Einfachklick, und dann, kurz danach, noch ein Einfachklick. Tatsächlich habe ich eben mal aus Neugier geschaut, wo (lapidar gesagt) der ClickCount um 1 erhöht wird, aber auf die schnelle nichts gefunden. Wie auch immer: Die Zeit, die zwischen zwei Mausklicks vergehen darf, damit sie als Doppelklick gelten, ist Systemspezifisch (kann jeder selbst einstellen). 

Ein Würgaround könnte sein: Nach dem ersten Klick einen Timer starten, und NUR wenn kurz später NICHT noch ein Klick kommt, das machen, was bei einem einzelnen Klick eben gemacht werden sollte. "Kurz später" wäre dann eben die oben angesprochene Zeit, die wohl irgendwie krampfig abgefragt werden muss. Eine schnelle Websuche nach den entsprechenden Stichworten liefert sowas wie events - Java : ignore single click on double click? - Stack Overflow - sollte man sich aber genau überlegen...


----------



## Ark (19. Aug 2011)

Das Problem ist, dass es kein Event für "war doch kein Doppelklick" gibt. Man müsste in einem eigenen Thread warten, bis die Zeit für einen Doppelklick verstrichen ist. Wenn bis dahin kein zweiter Klick angekommen ist (es also wirklich keinen Doppelklick gab), wird davon ausgegangen, dass nur ein Einfachklick erfolgte.

Damit kann das, was sonst bei einem Einfachklick sofort gemacht worden wäre, erst gemacht werden, wenn auch die Zeit für einen Doppelklick verstrichen ist. Leider habe ich keine Ahnung, wie man an die "Doppelklick-Geschwindigkeit" rankommt (also an die Millisekunden, innerhalb dieser zwei Klicks als Doppelklick gewertet werden).

Eine ganz andere Lösung: Kannst du eventuell die Bedienung so verändern, dass das Problem nicht auftritt? Also dass der Aktion, die mit einem Doppelklick verknüpft ist, immer ein Einfachklick vorausgehen könnte, ohne dass das unerwünschte Folgen hätte?

Noch eine andere Lösung: Einen eigenen Mehrfachklick-Auswerter schreiben (auch mit betriebssystemunabhängiger Doppelklick-Geschwindigkeit) und die Anzahl der Klicks, die der EDT mitteilt, ignorieren.

Ark


----------



## SlaterB (19. Aug 2011)

jedes Mal einen neuen Timer starten scheint aufwendig, da könnte auch ein Thread die ganze Zeit mitlaufen,

clickcount des MouseEvents kann man sich dann im Grunde sparen, das ist das besonders verwirrende,
wenn man eh jeden Klick einzeln und noch die Wartezeit zwischen den Einzelklicks analysieren muss, dann hat man automatisch auch ne eigene clickcount-Zählung..


----------



## Camino (19. Aug 2011)

Marco13 hat gesagt.:


> Ich denke es ging darum, dass bei einem Einfachklick etwas passieren sollte, was aber bei einem Doppelklick NICHT passieren sollte.


Uuups, sorry, ich hätte das Posting vielleicht doch lieber genau lesen sollen... Nee, fällt mir auch nichts besseres dazu ein.


----------



## xehpuk (19. Aug 2011)

Ich habe das mal mit zwei Timern getestet (einer für Einfach- und einer für Mehrfachklick).

Mein Fazit ist, dass dies nicht wirklich praktikabel ist. Bei meinem aktuellen Rechner sind 500 ms Verzögerung eingestellt. Das macht sich dann schon recht deutlich merkbar, wenn man nur einen Einfachklick ausführen will.

Für diesen Zweck eignen sich Hilfstasten (Strg, Alt, Shift).


----------



## Marco13 (19. Aug 2011)

... und manche Leute haben auch mehr als eine Maustaste


----------



## it-girl (19. Aug 2011)

Vielen Dank für die vielen Antworten 

@ Marco13: Die anderen Maustasten ist schon mit anderen Funktionen belegt 

Also das klingt ja schon alles ziemlich kompliziert und mit Threads hab ich's leider nicht so... Aber ich hab mir das nochmal genau überlegt, was mein Programm bei einem Einfach- und einem Doppelklick machen soll, und bin zu dem Entschluss gekommen, dass das, was beim Einfachklick passiert, auch ruhig beim Doppelklick passieren kann.

LG
IT-girl


----------



## ARadauer (19. Aug 2011)

it-girl hat gesagt.:


> und bin zu dem Entschluss gekommen, dass das, was beim Einfachklick passiert, auch ruhig beim Doppelklick passieren kann.



Und dein Entschluss ist richtig :toll:
Wir hatten das Thema schon mal: http://www.java-forum.org/awt-swing-swt/106151-doppelklickzeit-system.html#post678203

Es ist eigentlich überall so, dass bei einem Doppelklick die Aktion des Einfachen Klickes auch ausgeführt wird..


----------



## bERt0r (19. Aug 2011)

Falls jemand was ähnliches benötigt:

```
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;


public class DoubleClickListener extends Thread implements MouseListener{
	
	private boolean keepRunning=true;
	private boolean mouseClicked=false;
	
	DoubleClickListener()
	{
		this.run();
	}
	
	public void run()
	{
		while(keepRunning)
		{
			if(mouseClicked)
			{
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) 
				{ Thread.currentThread().interrupt();}
				if(keepRunning)
				{
					if(Thread.interrupted())
					{
						doDoubleClickStuff();
					}
					else
					{
						doSingleClickStuff();
					}
				}
				mouseClicked=false;
			}
			yield();
		}
	}
	
	
	private void doSingleClickStuff() {
		System.out.println("Einzelklick");
		
	}


	private void doDoubleClickStuff() {
		System.out.println("Doppelklick");
		
	}
	

	@Override
	public void mouseClicked(MouseEvent e) 
	{
		mouseClicked=true;
		if(e.getClickCount()==2)
		{
			this.interrupt();
		}
	}
	
	public static void main(String args[])
	{
		JFrame frame=new JFrame();
		frame.setSize(100,100);
		DoubleClickListener dc=new DoubleClickListener();
		dc.start();
		frame.addMouseListener(dc);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	
	public void close()
	{
		keepRunning=false;
		this.interrupt();
	}


	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
}
```


----------



## OldBoy (19. Aug 2011)

Mal ne doofe Frage,
wär es nicht möglich das Ding von hinten aufzuzäumen,
also erst mal fragen, ob die Zahl der Klicks >=2 war
und wenn ja, dann braucht man ja nach nem einfachen Klick nicht mehr zu fragen..:-/


----------



## Marco13 (19. Aug 2011)

Ja, gute Idee :idea: Wenn man eine Zeitmaschine hat, funktioniert das dann auch :joke:

Im Ernst: Es kommt ein Klick, mit clickCount 1. Soll man dann das passieren, was bei einem einzelnen Klick passieren soll? Ja? Aber vielleicht kommt ja 10 Millisekunden später ein weiterer Klick, der dann clickCount 2 hat. Also hätte der erste Klick DOCH nichts machen sollen. Das weiß man aber erst nach dem zweiten...


----------



## vanny (20. Aug 2011)

Mal noch ne Frage von mir, weil sie hier so schön reinpasst.

Woher erfahre ich, wie der Benutzer seine Doppelklickzeit im System eingestellt hat?


----------



## xehpuk (20. Aug 2011)

```
final int multiClickInterval = (Integer) Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");
```


----------

