Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Doppelklick von Einzelklick unterscheiden, aber richtig ...
um einen Doppelklick von einem Einzelklick zu unterscheiden, frage ich im Moment mit Hilfe der Methode
Code:
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.
Java:
@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?
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?
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.
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.
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
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.
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
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...
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
Code:
mousePressed(MouseEvent arg0)
und
Code:
mouseReleased(MouseEvent arg0)
ausgeführt. Manchmal wird aber auch die Methode
Code:
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.
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.
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.