Home / Programmazione / Java / Usare la icon tray in Java
Mattepuffo

Usare la icon tray in Java

Usare la icon tray in Java

La icon tray è quella zona della barra delle applicazioni in cui i programmi messi a icona si nascondono.

In genere è messa nella parte a destra, dove troviamo anche le icone della batteria, l'antivirus, la rete, ecc...

Vediamo oggi come fare per usare la icon tray nei nostri programmi scritti in Java.

Tutto ciò è stato testato su Windows 7 e Linux con KDE, ma in toeria non dovremmo avere problemi su versioni precedenti di Windows o su altri DE che usano la icon tray (tipo MATE o CINNAMON).

Non so invece come si comporta questo codice su Mac OS X.

Crieamo un metodo privato che poi richiamiamo in fondo al csotruttore del nostro JFrame.

Questo il metodo:

private void checkSystemTray() {
        final SystemTray tray = SystemTray.getSystemTray();
        final TrayIcon trayIcon = new TrayIcon(createImage(10, 10));
        if (SystemTray.isSupported()) {
            final PopupMenu popup = new PopupMenu();
            MenuItem trayExitItem = new MenuItem("Exit");
            trayExitItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });
            trayIcon.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (e.getClickCount() == 2) {
                        setVisible(true);
                        setExtendedState(JFrame.NORMAL);
                    }
                }
            });
            popup.add(trayExitItem);
            trayIcon.setPopupMenu(popup);
        }
        addWindowStateListener(new WindowStateListener() {
            @Override
            public void windowStateChanged(WindowEvent e) {
                if (e.getNewState() == ICONIFIED) {
                    try {
                        tray.add(trayIcon);
                    } catch (AWTException ex) {
                        JOptionPane.showMessageDialog(null, ex.getMessage());
                    }
                    setVisible(false);
                }
                if (e.getNewState() == WindowEvent.WINDOW_CLOSING) {
                    System.exit(0);
                }
                if (e.getNewState() == NORMAL) {
                    tray.remove(trayIcon);
                }
            }
        });
    }

Prima creiamo un oggetto di tipo TrayIcon; notate che in questo caso verrà creato un semplice quadratino bianco usando il metodo createImage.

Nella if controlliamo se il sistema operativo supporta la SystemTray.

In tal caso creiamo un oggetto PopupMenu e un oggetto MenuItem (che nel mio caso corriponde all'EXIT).

Su questo item impostiamo un evento che corrisponde all'uscita del programma.

Sotto, invece, impostiamo un evento per intercettare il doppio click del mouse.

Poi aggiungiamo un evento alla finestra per capire lo stato attuale della finestra e intercettare un suo eventuale cambiamento.

Se è messo a icona gli diciamo di aggiungere l'icona alla tray e nascondiamo la finestra; se l'evento corrisponde alla chiusura della finestra allora usciamo dal programma; infine se mettiamo la finestra visibile diciamo di levare l'icona.

Ovviamente scegliete il comportamento che più vi piace.