2012-09-05 2 views
5

Ich arbeite an einer einfachen Java-Swing-App, die beim Erstellen ein Symbol zur Systemablage hinzufügt. Was ich versuche zu tun, ist zu erkennen, wenn dieses Symbol einzeln vom Benutzer angeklickt wird (ob durch Linksklick oder Rechtsklick). Es gibt kein Popup-Menü. Ich möchte nur, dass die App wiederhergestellt wird, wenn auf das Symbol geklickt wird.Wie erkennen Sie einzelne Klicks auf System TrayIcon für Java App?

Dies ist der Code Ich verwende:

SystemTray tray = SystemTray.getSystemTray(); 
    Image icon = toolkit.getImage("icon.png"); 

    ActionListener listener = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      System.out.println("click detected"); 
     } 
    }; 

    TrayIcon trayIcon = new TrayIcon(icon, "Test Program", null); 
    trayIcon.addActionListener(listener); 
    tray.add(trayIcon); 

Was, wenn ich aber laufen dieses Programm passiert, ist, dass einzelne Klicks (links oder rechts) keine Wirkung haben, aber wenn ich Doppelklick, dann Es zeigt die Meldung "Klick erkannt" in der Konsole.

Was kann ich tun, damit auch einzelne Klicks erkannt werden? Muss ich dafür einen MouseListener verwenden? (Ich habe gehört, dass MouseListeners Probleme verursachen können, und ActionListeners sind besser)

+0

Welche Plattform? Windows? Linux? – Femi

+0

@Femi Windows - –

+2

nur 30k up_votes ???, +1 – mKorbel

Antwort

11

Sie MouseListener verwenden könnte, das heißt:

icon.addMouseListener(new MouseAdapter() { 
    public void mouseClicked(MouseEvent e) { 
     if (e.getClickCount() == 1) { 

     } 
    } 
}); 

Siehe How to Write a Mouse Listener für weitere Details.

EDIT: Action vs Mouselistener

Es ist ein Konzept der Low-Pegel und semantische Ereignisse. Wann immer möglich sollten Sie auf semantische Ereignisse und nicht auf Ereignisse auf niedriger Ebene achten, z. B. auf Aktionsereignisse statt auf Mausereignisse. Lesen Sie für weitere Details in Low-Level Events and Semantic Events.

In diesem Fall benötigen Sie nur weitere Details aus dem Ereignis, so dass die Verwendung von MouseListener erforderlich ist.

+0

Gibt es keine Probleme mit MouseListeners und ActionListeners bevorzugt? –

+0

@ClickUpvote sehen, ob meine letzte Bearbeitung einen Unterschied zwischen ActionListener und MouseListener klären kann. – tenorsax

+0

kann auch überprüfen, ob e.getID() == MouseEvent.MOUSE_CLICKED, es sei denn, Sie möchten nur auf die "mouse down" Benachrichtigung reagieren (was Sie vielleicht ...) – rogerdpack

Verwandte Themen