2012-09-05 13 views
5

Sto lavorando a una semplice app Java swing, che aggiunge un'icona alla barra delle applicazioni quando viene creata. Quello che sto cercando di fare è rilevare quando questa icona è cliccata dall'utente (sia con il tasto sinistro o con il tasto destro del mouse), Non c'è un menu popup, voglio solo che l'app venga ripristinata quando si fa clic sull'icona.Come rilevare singoli clic su System TrayIcon per l'app Java?

Questo è il codice che sto utilizzando:

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); 

Cosa succede quando si esegue questo programma, però, è che i clic singoli (a destra oa sinistra) non hanno alcun effetto, ma quando faccio doppio clic, quindi mostra il messaggio "clic rilevato" nella console.

Cosa posso fare per rilevare anche i singoli clic? Devo usare un MouseListener per questo? (Ho sentito dire che MouseListeners possono causare problemi, e ActionListeners sono migliori)

+0

Quale piattaforma? Finestre? Linux? – Femi

+0

@Femi Windows - –

+2

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

risposta

11

Si potrebbe utilizzare MouseListener, vale a dire:

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

     } 
    } 
}); 

Vedere How to Write a Mouse Listener per maggiori dettagli.

EDIT: ActionListener vs MouseListener

C'è un concetto di basso livello e gli eventi semantici. Quando possibile, dovresti ascoltare gli eventi semantici piuttosto che gli eventi di basso livello, come ascoltare eventi di azione, piuttosto che eventi di mouse. Leggi per maggiori dettagli su Low-Level Events and Semantic Events.

In questo caso è sufficiente disporre di ulteriori dettagli dall'evento, quindi è necessario utilizzare MouseListener.

+0

Non ci sono problemi con MouseListeners e ActionListeners preferiti? –

+0

@ClickUpvote verifica se la mia ultima modifica può chiarire una differenza tra ActionListener e MouseListener. – tenorsax

+0

potrebbe anche voler controllare se e.getID() == MouseEvent.MOUSE_CLICKED a meno che non si desideri rispondere solo alla notifica "mouse down" (che si potrebbe ...) – rogerdpack

Problemi correlati