2012-09-05 18 views
5

Estoy trabajando en una sencilla aplicación Java swing, que agrega un ícono a la bandeja del sistema cuando se crea. Lo que trato de hacer es detectar cuándo el usuario hace clic en un solo icono (ya sea haciendo clic con el botón izquierdo o haciendo clic con el botón derecho), no hay un menú emergente, solo quiero restaurar la aplicación cuando se hace clic en el icono.¿Cómo detectar clics individuales en la aplicación System TrayIcon for Java?

Este es el código que estoy usando:

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

¿Qué pasa cuando ejecuta este programa, sin embargo, es que los clics individuales (ya sea izquierda o derecha) no tienen ningún efecto, pero cuando hago doble clic, a continuación, muestra el mensaje "clic detectado" en la consola.

¿Qué puedo hacer para que también se detecten los clics individuales? ¿Necesito usar un MouseListener para esto? (He oído que MouseListeners pueden causar problemas, y ActionListeners son mejores)

+0

¿Qué plataforma? Windows? Linux? – Femi

+0

@Femi Windows - –

+2

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

Respuesta

11

Usted podría utilizar MouseListener, es decir:

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

     } 
    } 
}); 

Ver How to Write a Mouse Listener para más detalles.

EDIT: ActionListener vs MouseListener

Hay un concepto de nivel bajo y eventos semánticos. Siempre que sea posible, debe escuchar eventos semánticos en lugar de eventos de bajo nivel, como escuchar eventos de acción, en lugar de eventos de mouse. Lee para obtener más detalles en Low-Level Events and Semantic Events.

En este caso, solo necesita más detalles del evento, por lo que es necesario utilizar MouseListener.

+0

¿No hay problemas con MouseListeners y ActionListeners preferidos? –

+0

@ClickUpvote para ver si mi última edición puede aclarar una diferencia entre ActionListener y MouseListener. – tenorsax

+0

también querrá comprobar si e.getID() == MouseEvent.MOUSE_CLICKED a menos que desee responder solo a la notificación "mouse down" (que podría ...) – rogerdpack

Cuestiones relacionadas