Wie Doppelklick und Einfachklick unterscheiden?

it-girl

Aktives Mitglied
Hallo zusammen,

in meinem Programm möchte ich gerne einen Doppelklick von einem Einfachklick unterscheiden. Ich habe schon oft diese Lösung gefunden:
Java:
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:
Java:
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
 
C

Camino

Gast
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

Top Contributor
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

Top Contributor
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

Top Contributor
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
 
Zuletzt bearbeitet:
S

SlaterB

Gast
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..
 

xehpuk

Top Contributor
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).
 
Zuletzt bearbeitet:

it-girl

Aktives Mitglied
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.:D

LG
IT-girl
 

ARadauer

Top Contributor

bERt0r

Top Contributor
Falls jemand was ähnliches benötigt:
Java:
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
		
	}
	
}
 
Zuletzt bearbeitet:
O

OldBoy

Gast
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

Top Contributor
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...
 
V

vanny

Gast
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

Top Contributor
Java:
final int multiClickInterval = (Integer) Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Einfachklick / Doppelklick Java Basics - Anfänger-Themen 3
U Jar Datei per Doppelklick ausführen / Entwicklungsumgebung Java Basics - Anfänger-Themen 4
R JAR File startet nur per Doppelklick aber nicht per CMD Java Basics - Anfänger-Themen 4
M Doppelklick Java Basics - Anfänger-Themen 9
K .jar Datei mit Doppelklick öffnen Java Basics - Anfänger-Themen 26
Z In JList per Doppelklick eine Datei öffnen (z.B. ein PDF) Java Basics - Anfänger-Themen 16
W Java-Programm als Icon mit Doppelklick einfach öffnen ? Java Basics - Anfänger-Themen 3
Error257 Doppelklick-Anwendung Java Basics - Anfänger-Themen 6
C *.java Datei nach Doppelklick mit VM ausführen Java Basics - Anfänger-Themen 29
H .jar Consolenprogramm mittels Doppelklick starten Java Basics - Anfänger-Themen 2
S JTable--Beschreiben der Zellen durch Doppelklick verhindern Java Basics - Anfänger-Themen 4
G *.jar Doppelklick Java Basics - Anfänger-Themen 3
G JAR-Datei durch Doppelklick nicht startbar Java Basics - Anfänger-Themen 4
F Doppelklick-Event auf JTree Java Basics - Anfänger-Themen 5
A Java Programm mit Doppelklick ausführen Java Basics - Anfänger-Themen 2
J java dateien mit doppelklick öffnen Java Basics - Anfänger-Themen 3
S Doppelklick Java Basics - Anfänger-Themen 2
S Starten eines Programmes per Doppelklick Java Basics - Anfänger-Themen 10
F Packprogramm öffnet sich bei Doppelklick auf jar-Datei Java Basics - Anfänger-Themen 26
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
Adi18 "i" von "ie" unterscheiden Java Basics - Anfänger-Themen 7
Khaled-Abo Ziffern unterscheiden mittels einer For-Schleife Java Basics - Anfänger-Themen 6
N Vererbung Verschiedene Subclasses nach cast zur Superclass unterscheiden Java Basics - Anfänger-Themen 9
L Vererbung - Wie Objekte verschiedener Klassen unterscheiden Java Basics - Anfänger-Themen 3
B Relative/Absolute Pfadangabe. Wie unterscheiden? Java Basics - Anfänger-Themen 4
G unterscheiden von *.txt / *.html Java Basics - Anfänger-Themen 3
K wie klasse, zum unterscheiden von einträgen, einbinden? Java Basics - Anfänger-Themen 2
S Wie unterscheiden welcher Button geklickt wurde? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben