2011-01-02 7 views
11

ich das Forum suchen und diese Codes sehen:Unterscheiden zwischen einem Klick und Doppelklick in Java

  public void mouseClicked(MouseEvent e) { 
      if (e.getClickCount() == 2) { 
       System.out.println(" and it's a double click!"); 
       wasDoubleClick = true; 
      } else { 
       Integer timerinterval = (Integer) Toolkit.getDefaultToolkit().getDesktopProperty(
         "awt.multiClickInterval"); 
       timer = new Timer(timerinterval.intValue(), new ActionListener() { 

        public void actionPerformed(ActionEvent evt) { 
         if (wasDoubleClick) { 
          wasDoubleClick = false; // reset flag 
         } else { 
          System.out.println(" and it's a simple click!"); 
         } 
        } 
       }); 
       timer.setRepeats(false); 

       timer.start(); 
      } 

     } 

aber der Code läuft falsch (Irgendwann es druckt „und es ist ein Klick!“ 2 mal Es sollte ausgedruckt werden "und es ist ein Doppelklick!"). Kann mir jemand zeigen warum? oder kannst du mir bessere Möglichkeiten geben, dies zu tun? Vielen Dank!

+0

kann ich ASK- genau das, was der obige Code ist versucht, zu erreichen? Wofür ist diese Anwendung? möchte eine bessere Vorstellung davon bekommen, was du erreichen willst. –

+0

Related (reference): http://stackoverflow.com/questions/548180/java-ignore-single-click-on-double-click?rq=1 – Jayan

Antwort

17

Irgendwann druckt es "und es ist ein einziger Klick!" 2 Mal . Es sollte ausgedruckt werden "und es ist ein Doppelklick!").

Das ist normal. Ein Doppelklick erfolgt nur, wenn Sie innerhalb des angegebenen Zeitintervalls zweimal klicken. Wenn Sie also nicht schnell genug klicken, erhalten Sie manchmal zwei einzelne Klicks hintereinander.

Die obige Codezeile bestimmt, wie schnell der Doppelklick sein muss.

Für was es wert ist hier ist ein Code, den ich verwendet habe, um das Gleiche zu tun. Sie wissen nicht, ob seine besser oder schlechter als der Code, den Sie haben:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class ClickListener extends MouseAdapter implements ActionListener 
{ 
    private final static int clickInterval = (Integer)Toolkit.getDefaultToolkit(). 
     getDesktopProperty("awt.multiClickInterval"); 

    MouseEvent lastEvent; 
    Timer timer; 

    public ClickListener() 
    { 
     this(clickInterval); 
    } 

    public ClickListener(int delay) 
    { 
     timer = new Timer(delay, this); 
    } 

    public void mouseClicked (MouseEvent e) 
    { 
     if (e.getClickCount() > 2) return; 

     lastEvent = e; 

     if (timer.isRunning()) 
     { 
      timer.stop(); 
      doubleClick(lastEvent); 
     } 
     else 
     { 
      timer.restart(); 
     } 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     timer.stop(); 
     singleClick(lastEvent); 
    } 

    public void singleClick(MouseEvent e) {} 
    public void doubleClick(MouseEvent e) {} 

    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("Double Click Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.addMouseListener(new ClickListener() 
     { 
      public void singleClick(MouseEvent e) 
      { 
       System.out.println("single"); 
      } 

      public void doubleClick(MouseEvent e) 
      { 
       System.out.println("double"); 
      } 
     }); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
    } 
} 
+0

Die Doppelklickgeschwindigkeit für Ubuntu Linux war so schnell, dass ich sie als unbrauchbar empfand (wenn ich mich darauf konzentrierte, einen Doppelklick schnell genug zu machen, bewegte sich die Maus oft leicht und erzeugte zwei einzelne Klicks). Aus diesem Grund würde ich vermeiden, Aktionen basierend auf Doppelklickereignissen zu verwenden, wenn dies praktikabel ist. –

+2

Guter Punkt, wenn die Maus ein oder zwei Pixel bewegt, wodurch die Anzahl der Klicks zurückgesetzt wird. Im Allgemeinen empfehle ich diesen Ansatz auch nicht, da Sie nie einen einzigen Klick ignorieren sollten. Der einzelne Klick sollte verwendet werden, um etwas "auszuwählen", und der Doppelklick wird dann verwendet, um den ausgewählten Gegenstand auszuführen und zu "handeln". Die Klasse, die ich gepostet habe, erlaubt es dir, die Doppelklickgeschwindigkeit zu steuern, um sie benutzbarer zu machen, wenn du willst. – camickr

+3

(natürlich natürlich :-) sollte man nicht mit OS-generiertem Verhalten interferieren: zwischen Double und Single unterscheiden ist die Aufgabe des zugrundeliegenden Systems. Wenn das entscheidet, ist es kein Doppelklick, sei es so. Sonst müssen Benutzer ihr Klickgeschwindigkeitsverhalten pro Anwendung anpassen. – kleopatra

0
public void mouseClicked(MouseEvent evt) { 
    if (evt.getButton()==MouseEvent.BUTTON1){ 
    leftClick = true; clickCount = 0; 
    if(evt.getClickCount() == 2) doubleClick=true; 
    Integer timerinterval = (Integer)Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval"); 

       timer = new Timer(timerinterval, new ActionListener() { 
       public void actionPerformed(ActionEvent evt) { 
        if(doubleClick){ 
         System.out.println("double click."); 
         sb = new StringBuffer(); 
         sb.append("Double Click"); 
         clickCount++; 
         if(clickCount == 2){        
          clickCount=0; 
          doubleClick = false; 
         } 

        } else { 

         sb = new StringBuffer(); 
         sb.append("Left Mouse"); 
         System.out.println("single click.");       
        } 
       }    
      }); 
      timer.setRepeats(false); 
      timer.start(); 
      if(evt.getID()==MouseEvent.MOUSE_RELEASED) timer.stop(); 
}   
+0

@Aptos Ich hoffe, dass mein Code Ihnen helfen wird. Viel Glück!!! :) – Anonymous

+0

@ Juno - Ich stelle fest, dass dieser Thread fast ein Jahr alt ist, also sollte ich vielleicht nicht einmal fragen ... aber Ihr Code druckt nicht "Doppelklick". zweimal wenn der Benutzer doppelklickt? Ich weiß nicht, ob das deine Absicht war oder die Implikationen der Situation. Es scheint einfach nicht effizient, aber ich kann sicherlich den Punkt vermissen. – DSlomer64

+0

@ DSlomer64 Vielen Dank für Ihren Kommentar. Das ist vielleicht mein Fehler. Ich teste Mausklick-Ereignisse für mein Projekt, die erfasst werden müssen, wenn ein Einzelklick-Ereignis auftritt oder ein Doppelklick auftritt. System.out.print testet auf Klickereignis. sb.append ("") ist die Voraussetzung meines Projektes. Was auch immer dir Dank. – Anonymous