Antes vimos como Minimizar una aplicación .NET a la Tray Bar. En esta ocasión, minimizaremos a la barra tray una aplicación Java.

Basado en el artículo de SDN, este es el resuemn de los pasos a seguir:

  • Declarar los atributos de clase que referenciarán a los objetos de la barra tray, ícono de la barra tray, menú contextual y elementos del menú contextual.

private javax.swing.JMenuItem menuItemRestore;
private javax.swing.JMenuItem menuItemSalir;
private javax.swing.JPopupMenu popupContextual;
private javax.swing.JSeparator separator;

private SystemTray          tray;
private final TrayIcon      trayIcon;

  • Crear un menu contextual (aquel que se desplegará al hacer clic sobre el ícono de la barra tray). Si lo haces con NetBeans, el código se generará automáticamente.

popupContextual = new javax.swing.JPopupMenu();
menuItemRestore = new javax.swing.JMenuItem();
separator = new javax.swing.JSeparator();
menuItemSalir = new javax.swing.JMenuItem();

menuItemRestore.setText("Restaurar");
menuItemRestore.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        menuItemRestoreActionPerformed(evt);
    }
});
popupContextual.add(menuItemRestore);
popupContextual.add(separator);

menuItemSalir.setText("Salir");
menuItemSalir.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        menuItemSalirActionPerformed(evt);
    }
});
popupContextual.add(menuItemSalir);

  • Agregar los handlers para los actionPerformed de los elementos del Menu Contextual:

private void menuItemRestoreActionPerformed(java.awt.event.ActionEvent evt) {
     this.setVisible(true);
     this.toFront();
     tray.remove(trayIcon);
 }

 private void menuItemSalirActionPerformed(java.awt.event.ActionEvent evt) {
     System.exit(0);
 }

  • Agregar el handler para el evento windowStateChanged del JFrame base:

private void EstadoCambiado(java.awt.event.WindowEvent evt) {

    if ( evt.getNewState() == ICONIFIED) {
        this.setState(NORMAL);
        this.setVisible(false);

        if (SystemTray.isSupported()) {

            tray = SystemTray.getSystemTray();

            MouseListener mouseListener = new MouseListener( ) {

                public void mouseClicked(MouseEvent e) {
                    if ( e.getButton()==e.BUTTON1 ) {
                        trayIcon.displayMessage("AppTray", "Haz hecho clic sobre mi!",TrayIcon.MessageType.INFO);
                    }
                }

                public void mouseEntered(MouseEvent e) {

                }

                public void mouseExited(MouseEvent e) {

                }

                public void mousePressed(MouseEvent e) {

                }

                public void mouseReleased(MouseEvent e) {
                    if (e.isPopupTrigger()) {
                        popupContextual.setLocation(e.getX(), e.getY());
                        popupContextual.setInvoker(popupContextual);
                        popupContextual.setVisible(true);
                    }
                }
            };

            trayIcon.setImageAutoSize(true);
            trayIcon.addMouseListener(mouseListener);
            trayIcon.addActionListener( new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        menuItemRestoreActionPerformed(e);
                    }
                }
            );

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                System.err.println("No se pudo agregar el ícono a la barra tray");
                this.setVisible(true);
            }
        } else {
            //  System Tray is not supported
        }
    }
}

Descargar el proyecto de ejemplo AppTray (desarrollado en NetBeans 6.0)