# Doppelklick von Einzelklick unterscheiden, aber richtig ...



## propra (15. Nov 2011)

Hallo zusammen,

um einen Doppelklick von einem Einzelklick zu unterscheiden, frage ich im Moment mit Hilfe der Methode 
	
	
	
	





```
getClickCount()
```
 die Anzahl der Klicks ab. Funktioniert auch soweit.
Das Problem was ich allerdings habe, ist das ich dadurch auch automatisch einen Einzelklick ausführe.

```
@Override
public void mousePressed(MouseEvent arg0) {

	if (arg0.getClickCount() == 2) {
		System.out.println("Doppelklick");
	}
			
	if (arg0.getClickCount() == 1) {
		System.out.println("Einzelklick");
	}
}
```

Der Code oben führt zur Ausgabe:
Einzelklick
Doppelklick

Gibt es einen Möglichkeit, dass nur der Block des Doppelklicks ausgeführt wird?


----------



## Gossi (15. Nov 2011)

Sehr umständlich, aber das einzige was mir einfallen würde wäre nen Thread , aber da würde der Einzelklick zeiemlich verzögert ausgeführt werden....


----------



## ARadauer (15. Nov 2011)

Das Thema hatten wir bereits. Es gibt keinen Sinn den einfachen Klick zu ignorieren:

http://www.java-forum.org/awt-swing-swt/106151-doppelklickzeit-system.html#post678203


----------



## propra (15. Nov 2011)

Danke für die Antworten.

Ich würde es der Einfachheit halber lieber erst einmal ohne zusätzlichen Thread probieren.
Vielleicht sollte ich etwas mehr auf das Szenario eingehen.
Wie einige vielleicht aus anderen Threads mitbekommen haben, möchte ich auf einer Zeichenfläche (erbt von JPanel) Kreise und Rechtecke zeichnen.
Ich stelle es mir so vor, dass der Nutzer in der Menuleiste den entsprechenden Punkt auswählt. Dadurch wird eine Variable Zeichenmodus gesetzt und mit dem nächsten (Einzel-)Klick in die Zeichenfläche das entsprechende Symbol hinzugefügt.
Nun sollen die Symbole im Nachhinein noch verschiebbar sein. Bisher wollte ich es so lösen, dass mit einem Doppelklick ein Symbol ausgewählt werden kann. Das ausgewählte Symbol soll dann verschoben werden. Aber irgendwie ist das nicht sonderlich intuitiv.
Andere Möglichkeit bestünde darin, beim Klick in die Zeichenfläche zu testen, ob ein bereits vorhandenes Element ausgewählt wurde. Eine Variable "beweglich" zu setzen und diese so lange gültig zu lassen, bis die Maustaste losgelassen wird. Solange die Variable beweglich gültig ist, kann das Symbol verschoben werden.
Was meint Ihr? Ist Variante 2 intuitiv genug? Variante 2 hätte den weiteren Vorteil, dass man die Probleme mit dem Doppelklick umgeht.
Bin auch für Alternativen offen. Wie würdet Ihr so etwas lösen?


----------



## Xeonkryptos (15. Nov 2011)

Wenn ich ehrlich bin, finde ich Variante 2 leichter und einfacher und besser als deine erste Variante. Es gibt genug Programme, wo man, um etwas bewegen zu können, die Maus gedrückt halten muss, damit sich dieses "etwas" bewegen lässt.
Das sollte vielen zumindest vertraut sein. Ich finde Variante 1 mit dem Doppelklick eher als "unnatürlich". Man hat schon seine Gewohnheiten und wenn man etwas bewegen will ist das gedrückt halten der Maus wohl die beste und einfachste Variante. Für den User und dich.


----------



## Gast2 (15. Nov 2011)

Zum Verschieben würde ich Drag and Drop verwenden...


----------



## Tobse (15. Nov 2011)

Dü könntest ja ein STRG mit einbauen:
Der User drückt STRG wodurch alle verschiebbaren elemente hervogehoben werden (wie das passiert ist ja dafür unwichtig).
Jetzt kann der User, während er STRG gedrückt hält, mit dem Einzelklick per drag and drop die sachen verschieben. Und wenn STRG losgelassen wird kann er wieder formen zeichnen.


----------



## vanny (15. Nov 2011)

da du hier ja einmal eine Art Zeichnenmodus hast und einen Bewegen/Transformierenmodus, entweder wie schon erwähnt mit zBsp. Strg oder mit einer Toolbar und/oder nen Togglebutton für den Arbeitsmodus.
Das ganze schön ergänzt mit shortcuts und fertig is der Photoshop 

Naja aber das Rad muss da ja nun wirklich nicht neu erfunden werden und mit Doppelklick arbeiten die wenigsten guten Programme (zumind. nicht innerhalb der Zeichenfläche)

Gruß Vanny

PS: Dein Avatar hat schon irgendwie etwas wiederliches an sich


----------



## propra (17. Nov 2011)

Noch einmal Danke für die Antworten.



SirWayne hat gesagt.:


> Zum Verschieben würde ich Drag and Drop verwenden...



Was meinst Du damit? Klar soll es auf Drag & Drop hinauslaufen.
Meinst Du damit, dass ich was "fertiges" aus der Java Klassenbibliothek nutzen soll?



Tobse hat gesagt.:


> Dü könntest ja ein STRG mit einbauen:
> Der User drückt STRG wodurch alle verschiebbaren elemente hervogehoben werden (wie das passiert ist ja dafür unwichtig).
> Jetzt kann der User, während er STRG gedrückt hält, mit dem Einzelklick per drag and drop die sachen verschieben. Und wenn STRG losgelassen wird kann er wieder formen zeichnen.



Ich hatte mir für die Funktion der STRG-Taste überlegt, dass sie es ermöglicht mehrere Elemente auszuwählen.



vanny hat gesagt.:


> da du hier ja einmal eine Art Zeichnenmodus hast und einen Bewegen/Transformierenmodus, entweder wie schon erwähnt mit zBsp. Strg oder mit einer Toolbar und/oder nen Togglebutton für den Arbeitsmodus.
> Das ganze schön ergänzt mit shortcuts und fertig is der Photoshop



Im Moment erfolgt die Auswahl noch über die Menuleiste. Soll aber, wenn es fertig ist, ebenfalls über eine Toolbar einzustellen sein.



vanny hat gesagt.:


> PS: Dein Avatar hat schon irgendwie etwas wiederliches an sich



Also nachmachen möchte ich es auch nicht, wobei es schon einen gewissen artistischen Reiz hat. Wer kann schon von sich behaupten, dass er so etwas kann... 



propra hat gesagt.:


> Andere Möglichkeit bestünde darin, beim Klick in die Zeichenfläche zu testen, ob ein bereits vorhandenes Element ausgewählt wurde. Eine Variable "beweglich" zu setzen und diese so lange gültig zu lassen, bis die Maustaste losgelassen wird. Solange die Variable beweglich gültig ist, kann das Symbol verschoben werden.
> Was meint Ihr? Ist Variante 2 intuitiv genug? Variante 2 hätte den weiteren Vorteil, dass man die Probleme mit dem Doppelklick umgeht.
> Bin auch für Alternativen offen. Wie würdet Ihr so etwas lösen?



Nachdem ich mich nun mehrere Stunden damit beschäftigt habe, komme ich dem gewünschten Ablaufverhalten langsam näher. 
Es soll so ablaufen, dass wenn die Maustaste gedrückt (muss dafür auch nicht zwangsläufig wieder losgelassen werden) wurde, geprüft wird, ob sich bereits ein Symbol an der Stelle befindet. Im positiven Falle wird es markiert und wenn nicht, dann soll je nach Modus gezeichnet werden. Ein Klick mit der rechten Maustaste hebt die Auswahl wieder auf.
Mein Problem war eigentlich, wie ich den Code auf die Methoden des MouseListener "verteile".
Wenn ich die Maustaste drücke und eine Zeit lang gedrückt lasse, dann wieder loslasse, wird das nicht immer als Mausklick registriert. Es werden also nur die Methoden 
	
	
	
	





```
mousePressed(MouseEvent arg0)
```
 und 
	
	
	
	





```
mouseReleased(MouseEvent arg0)
```
 ausgeführt. Manchmal wird aber auch die Methode 
	
	
	
	





```
mouseClicked(MouseEvent arg0)
```
 ausgeführt. Nach welchem Kriterium dies geschieht, weiß ich nicht. Hat da jemand vielleicht einen Tipp zu?
Ich denke dies ist eine intuitive und "normale" Vorgehensweise. Zumindest entspricht sie dem Verhalten auf meinem Desktop, wenn ich einen Ordner anklicke und ihn verschieben möchte.


----------



## Gast2 (17. Nov 2011)

Introduction to DnD (The Java™ Tutorials > Creating a GUI With JFC/Swing > Drag and Drop and Data Transfer)


----------



## propra (17. Nov 2011)

ARadauer hat gesagt.:


> Das Thema hatten wir bereits. Es gibt keinen Sinn den einfachen Klick zu ignorieren



Das stimmt, dass es keinen Sinn macht. Aber man muss sich erst einmal Gedanken darüber machen, dass so ein Doppelklick im Prinzip das Ausführen von 2 Aktionen ist. Macht man das nämlich nicht und betrachtet den Doppelklick als einzelne Aktion, dann kommt man dazu, dass man einen Einzelklick von einem Doppelklick unterscheiden möchte. 
Danke dafür.



SirWayne hat gesagt.:


> Introduction to DnD (The Java™ Tutorials > Creating a GUI With JFC/Swing > Drag and Drop and Data Transfer)



Hatte damit gerechnet, dass Du mich auf das Tutorial verweist. Ich möchte im Moment meine Symbole immer nur auf einer Zeichenfläche verschieben, weshalb mir die Lösung etwas überproportioniert erscheint.
Trotzdem Danke und wer weiß, vielleicht brauche ich es ja doch noch.


----------

