Swing Doppelklickzeit vom System

jared

Aktives Mitglied
Hi!!!
Ich habe zwei Bedingungen einmal if (getClickCount == 1) else if (getclickcount == 2)
Da man hiermit aber nicht so gut abfangen kann, ob das jetzt ein normaler Click oder doppelclick war, da er ja beim ersten Mal in die 1. if rein geht und beim zweiten mal in des zweite, kann man nicht wirklich abprüfen ob man doppelgeklickt hat oder nicht. Aus diesem Grund habe ich einen Thread eingebaut, der eine bestimmte Zeit wartet und danach prüft ob ein Doppelklick ausgeführt wurde.
Jetzt wollte ich für diese Zeit wissen, ob es möglich ist diese Zeit vom OS auszulesen um exakt die selbe Zeit hierfür zu bekommen??
Wisst ihr da was??

mfg
 

truesoul

Top Contributor
geschickter wäre es, wenn du deine Abfrage-Reihenfolge einfach änderst und sofern 2x geklickt wurde, einfach returnst!

Java:
if (getClickCount == 2){
//mache irgendwas
return;
}
 else if (getclickcount == 1){
// wenn nun 2x geklickt worden ist, wird dein Programm hier nicht hinkommen!
}

Also da spielt die Reihenfolge keine Rolle, es wird trotzdem der else if Block aufgerufen! ( auch bei Doppelklick )

Mit SWT geht das aber:

Java:
 public class Test {  
   
     public static void main(String[] args) {  
         Display display = new Display();  
         Shell shell = new Shell(display);  
         shell.setLayout(new GridLayout());  
   
         Button button = new Button(shell, SWT.NONE);  
         button.setText("Drück Mich!");  
         button.addMouseListener(new MouseListener() {  
             private boolean doubleClick;  
   
             public void mouseUp(MouseEvent e) {  
             }  
   
             public void mouseDoubleClick(MouseEvent e) {  
                 doubleClick = true;  
                 System.out.println("Doppel Klick");  
             }  
   
             public void mouseDown(MouseEvent e) {  
                 doubleClick = false;  
   
                 System.out.println(e.count);  
                 Display.getDefault().timerExec(Display.getDefault().getDoubleClickTime(),  
                         new Runnable() {  
                             public void run() {  
                                 if (!doubleClick) {  
                                     System.out.println("Einzel Klick");  
                                 }  
                             }  
                         });  
             }  
         });  
         shell.pack();  
         shell.open();  
         while (!shell.isDisposed()) {  
             if (!display.readAndDispatch()) {  
                 display.sleep();  
             }  
         }  
     }  
 }

P.S Dies ist nur ein Beispiel wie es ausschauen könnte.
Mfg
 
Zuletzt bearbeitet:
M

MiDniGG

Gast
Nicht schön. Aber funktioniert:

Java:
public void mouseClicked(MouseEvent evt) {
    if(evt.getClickCount() == 1) {
        new Thread(new Runnable(){
            public void run() {
                try {
                    oneKlick = true;
                    Thread.sleep(250);
                    if(oneKlick) {
                        System.out.println("Einmal geklickt!");
                    }
                } catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    } else if(evt.getClickCount() == 2) {
        oneKlick = false;
        System.out.println("Zwei mal geklickt!");
    }
}

Der boolean
Code:
oneKlick
ist eine globale Variable.
 

jared

Aktives Mitglied
Genau so mache ich das gerade auch. Nur diese 250 ms. Um diese Zeit geht es. Das OS muss doch auch so eine Zeit haben, in der ein doppelklick noch als doppelklick zählt. Und diese Zeit möchte ich auslesen, wenn dies überhaupt geht. Oder gibt es generell eine festgelegte Zeit, in der ein Doppelklick noch als doppelklick ´zählt??

mfg
 
Zuletzt bearbeitet von einem Moderator:
M

MiDniGG

Gast
ARGH! Da hab ich mich ja mal voll verlesen. Sorry.

Ich könnte mir vorstellen, dass wenn überhaupt die Klasse Toolkit o. ä. was zur Verfügung hat. Aber da habe ich jetzt auf die Schnelle nichts gefunden.
 

jared

Aktives Mitglied
Ok. ich schau demnächst mal, habe jetzt erst eine wichtigere aufgabe. wenn dies aber nicht sdchon gelöst ist, wie würdet ihr das dann lösen?? kann bzw. darf zurzeit nur swing benutzen.

mfg
 
M

Morl99

Gast
Mit genau dieser Fragestellung sah ich mich auch schon konfrontiert. Ich habe persönlich keine von JAVA gegebene Möglichkeit gefunden dies umzusetzen und dann beschlossen, einfach eine eigene akzeptierte Doppelklickzeit festzusetzen. Für mich war das akzeptabel, obwohl die Windows Lösung schon besser wäre... aber dagegen spricht halt die Plattformunabhängigkeit von Java.

Bestimmt lässt sich das über JNA/JNI lösen, ob sich der Aufwand lohnt musst du selber entscheiden. Falls du aber über eine Bibliothek stolperst die dir genau das bietet, würde ich mich freuen wenn du kurz darauf verweist.

Ansonsten ist die Thread-Sleep Methode auch die einzige die mir einfällt den Einzelklick zu unterbinden, wenn ein Doppelklick folgt (IIRC wird in Windows aber der Einfachklick auch ausgeführt bevor der Doppelklick Wirkung zeigt, sprich, das Desktop-Icon wird erst markiert und dann ausgeführt...)
 

ARadauer

Top Contributor
Also konkret: Was ist die Frage? Wie kann ich einnen Doppelklick von einem einfach Klick unterscheiden?
Ich sags euch: Das ist irrelevanat!! Das interessiert nicht mal Windows!

Bei einem Klick wird eine Aktion ausgeführt die der Aktion vom Doppelklick vorausgehen kann.
Wenn ich auf ein normales Programicon im Betreibssystem doppelt klicke werden auch zwei Aktionen ausgeführt. Mein erster klick, das Icon wird markiert bzw bekommt den Fokus. Nächster Klick, der eventuell als doppelklick registriert wird, und das Programm wird gestartet....

zb Textfeld-> ein klick.. Cursor wird gesetzt, doppelklick.. Text wird markiert.. usw...

Also ihr habt vor bei einem doppelklick, die Aktion die bei einem einfach klick gemacht werden würde, nicht auszuführen??
Ich würde gerne den Anwendungsfall für das kennen. Ich finde das könnte zu schwerwiegenden usability problemen führen. Wenn komplet etwas anderes passiert nur weil er zu langsam klickt
 

madboy

Top Contributor
Also konkret: Was ist die Frage? Wie kann ich einnen Doppelklick von einem einfach Klick unterscheiden?
Ich sags euch: Das ist irrelevanat!! Das interessiert nicht mal Windows!
...
Also ihr habt vor bei einem doppelklick, die Aktion die bei einem einfach klick gemacht werden würde, nicht auszuführen??
Ich würde gerne den Anwendungsfall für das kennen. Ich finde das könnte zu schwerwiegenden usability problemen führen. Wenn komplet etwas anderes passiert nur weil er zu langsam klickt

Anwendungsfall? Doppelklick auf eine Verknüpfung. Klickst du zu langsam, startet das dahinter liegende Programm nicht ;-)

Lösung: MouseEvent (Java 2 Platform SE v1.4.2)

EDIT: nicht alles gelesen, nehme den Teil mit "Anwendungsfall?" wieder zurück :oops:
 
Zuletzt bearbeitet:

jared

Aktives Mitglied
Mit den beiden getClickount == 1 und getClickCount == 2 hatte ich am Anfang drinnen. Da ich aber diese beiden Sachen an einen Server schicken muss und sagen muss, dieses Element wurde markiert und dieses doppelgeklickt, kann ich nicht zwei Sachen so kurz hintereinander zum Server schicken.
Ich dachte mir jetzt folgendes, ich schicke in jedem Fall den markierten zum Server und wenn kurz darauf ein Doppelklick ausgeführt wurde, dann warte ich kurz und schicke danach den doppelklick zum Server, so mache ich es wie Windows, nur mit einer kleineren Verzögerung. Fändet ihr das besser bzw. schöner??
 

VfL_Freak

Top Contributor
Moin,

wenn ich es richtig verstanden habe, benötigst Du den Fall "clickCount == 1" nicht, oder ???:L

Also kannst Du doch ganz einfach so prüfen :
Java:
public void myTextArea_mouseClicked( MouseEvent e ) 
{
    if (e.getClickCount() > 1) 
    {
        // tue irgendwas ....
    }
}

Gruß
Klaus
 

jared

Aktives Mitglied
Doch den einfach klick brauche ich auch. Also ich schicke das eine runter und er führt etwas aus und in dieser Zeit ist er nicht bereit für eine weitere Nachricht bzw. Aktion.
Also ich kann es später noch einmal testen, ohne thread und nur mit den beiden bedingungen mit getclickcount, aber das wird wirklich später, also in der nächsten zeit erst mal nicht.

trotzdem vorerst mal danke.
 

VfL_Freak

Top Contributor
Moin,

VfL_Freak : beim Doppelklick bekommst du beide Events. erster klick clickcount =1, zweiter klick clickcount = 2

genau, deshalb ja auch die Abfrage auf "e.getClickCount() > 1" :D
Dann wird an der Stelle nur ein Doppelklick ausgewertet !

Aber das jared ja schrieb, dass er gleichzeitig den einfachen Klick auswerten will/muss, ist dies für ihn natürlich keine Lösung .... ;(

Gruß
Kalus
 

jared

Aktives Mitglied
Also ich würde getClickCount > 1 nur für einen Doppelklick nie machen. Denn wenn andere deinen Code lesen, wissen sie nie,wieso > 1?? Wenn man einen Doppelklick, nur einen Doppelklick abfangen möchte, dann sollte man auch nur getclickcount == 2 schreiben.
Aber so wies zurzeit aussieht, gibt es nur die oben genannte Lösung mit dem Thread, für solche Spezialfälle wie meinen.

mfg
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JavaFx TreeView mit file system AWT, Swing, JavaFX & SWT 1
J AWT System Farben / java.awt.SystemColor funktioniert nicht AWT, Swing, JavaFX & SWT 4
I JFileChooser mit System L&F bei anderem L&F der eigtl. Anwendung AWT, Swing, JavaFX & SWT 0
L Komplettes Löschen SWT vom System AWT, Swing, JavaFX & SWT 6
T JavaFX System.out.println in TextArea AWT, Swing, JavaFX & SWT 15
S Swing JRE System Libary AWT, Swing, JavaFX & SWT 3
A Wie baue ich das Bus-System in ein Java Projekt ein? AWT, Swing, JavaFX & SWT 5
M Benutzer-Dialog ohne System.in/out AWT, Swing, JavaFX & SWT 2
Luk10 Fragen zum Koordinaten System AWT, Swing, JavaFX & SWT 3
D System.out.println() gibt html-Tags mit aus AWT, Swing, JavaFX & SWT 2
GUI-Programmer Translucent JFrame mit System-LookAndFeel AWT, Swing, JavaFX & SWT 4
H Anwendung schließen ohne System.exit AWT, Swing, JavaFX & SWT 5
S 2D-Grafik Icon in Image (System Icons) AWT, Swing, JavaFX & SWT 2
S System.out in JTextArea AWT, Swing, JavaFX & SWT 4
A Swing Text von System.out.printIn in eine TextArea übergen AWT, Swing, JavaFX & SWT 12
R Wie in GUI System.out's darstellen AWT, Swing, JavaFX & SWT 8
T Dynamic JTree: File System Problem AWT, Swing, JavaFX & SWT 2
P System.exit(0); ausführen, wenn letztes Fenster geschlossen AWT, Swing, JavaFX & SWT 10
R MVC: System.out.prinln in View umleiten geht nicht richtig AWT, Swing, JavaFX & SWT 7
V Swing: System-Look&Feel unter KDE AWT, Swing, JavaFX & SWT 3
R Meldungen System.out.println auf Fenster umleiten? AWT, Swing, JavaFX & SWT 3
M Image in System Clipboard mit java 1.3 AWT, Swing, JavaFX & SWT 2
M Problem mit System.setOut()/setErr() und MultiThreading AWT, Swing, JavaFX & SWT 11
S K.O.-System zeichnen AWT, Swing, JavaFX & SWT 3
V System Look and Feel, FileChooser, Optionen einer jar-Datei AWT, Swing, JavaFX & SWT 10
D Auf System-Icons wie die aus JOptionPane zugreifen? AWT, Swing, JavaFX & SWT 6
S Defaulticon für einen Datentyp vom System bekommen? AWT, Swing, JavaFX & SWT 3
S LaF - switcht erst während des Runs auf System.LaF AWT, Swing, JavaFX & SWT 2
S Dispose() anstatt system.exit(0) AWT, Swing, JavaFX & SWT 8
G standard system icons AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben