Gestire le icone nella tray-area di sistema con Java 6

Viene analizzata la nuova funzionalità di Java 6 che permette di gestire icone e messaggi nella tray-area

Ci si aspetterebbe di gestire questa funzionalità con JDIC, vista la sua capacità di integrazione con l’ambiente desktop. E invece no! L’interazione con la traybar di sistema è una delle nuove funzionalità introdotte con il rilascio di Java 6.

L’implementazione fornita dal JDK6 gestisce, in modo del tutto indipendente dalla piattaforma in uso, i principali window-manager, dalla shell di Windows ai più comuni ambienti desktop per GNU/Linux, come KDE e Gnome. Poche righe di codice possono rendere un applicativo più vicino al concetto di software “nativo”, almeno dal punto di vista dell’interfaccia utente, sollevando lo sviluppatore dall’onere delle diverse modalità di gestione proprie dell’ambiente desktop in cui ci si trova.

La classe Java che si occupa di interfacciare l’applicazione alla traybar del sistema si chiama SystemTray, contenuta nel pacchetto java.awt. Come era giusto immaginare, questa classe non può essere istanziata liberamente, perciò è meglio dare un’occhiata ai metodi statici disponibili.

Una chiamata a questo metodo dovrebbe essere la prima istruzione all’interno del processo d’implementazione. Se il valore di ritorno è false, è chiaro che ci si trova in un ambiente in cui la traybar non è supportata. Meglio ripiegare su un’altra soluzione, quindi.

Ecco quello che ci occorre!

Sarà questo metodo a preoccuparsi di recuperare la traybar di sistema e di restituircela. Ovviamente, chiamate diverse a questo metodo restituiscono sempre lo stesso oggetto. Attenzione alle eccezioni, però!

Le due principali che il metodo minaccia di lanciare sono UnsupportedOperationException, nel caso la traybar non sia supportata dal sistema in uso, e SecurityException, se invece il SecurityManager ne ha disabilitato l’accesso. Entrambe le eccezioni sono di facile gestione, ad ogni modo.

Il metodo isSupported() descritto sopra garantisce che la traybar sia supportata ed una chiamata a checkPermission() sul SecurityManager di sistema, passando come parametro accessSystemTray, controlla il permesso d’accesso.

Benissimo! Ora che sappiamo come recuperare la traybar di sistema, buttiamo giù qualche riga di codice su quanto appena appreso

Perfetto, adesso abbiamo recuperato un oggetto di tipo SystemTray, ma vediamo meglio cosa Java ci permette di fare

  • void add(TrayIcon)
  • void remove(TrayIcon)
  • TrayIcon[] getTrayIcons()

 

A quanto pare siamo alle prese con un’altra classe da studiare. Gli oggetti di tipo TrayIcon rappresentano le icone all’interno della tray-area di sistema, ovvero della zona in cui si trovano le icone di stato o di notifica che permettono di accedere ai processi che girano in background.

In effetti, tale zona cambia nome e comportamento in base alla piattaforma. Sui sistemi Windows è nota come Taskbar Status Area, per Gnome si chiama Notification Area, KDE sceglie invece un più banale System Tray. Un’icona all’interno della tray-area è un componente AWT completo, in grado di legarsi ai Listener di eventi di tipo ActionEvent e MouseEvent e di ricevere, quindi, input da parte dell’utente.

A questo punto, se si vuole aggiungere una TrayIcon alla SystemTray, basta invocare il metodo add(TrayIcon) e per rimuoverla remove(TrayIcon). Il metodo add può essere invocato più volte, a patto che si passino oggetti diversi come argomento, pena una IllegalArgumentException.

Di fatto, ogni chiamata aggiunge una TrayIcon nella tray-area. Il compito del metodo getTrayIcons() è quindi facile da immaginarsi: recupera tutte le icone inserite nella tray-area dall’istanza corrente della JVM.

Passiamo ora a vedere come creare una TrayIcon per la nostra applicazione. Tale classe ha a disposizione tre costruttori. Prendiamo quello più pratico per quello che ci interessa ora.

Chiaro, no? Prepariamoci la nostra iconcina ad una risoluzione consona per la tray-area (16×16 pixel, ad esempio, per la più banale delle barre di Windows), carichiamola in un oggetto di tipo Image e costruiamo la nostra icona.

Aggiungiamola alla tray-area nel modo che abbiamo visto, facendo però attenzione: il fatto che la system tray sia supportata, non vuol dire che siamo supportate TUTTE le sue funzionalità. Potrebbe, ad esempio, mancare una barra in cui inserire le icone; in tal caso, il metodo add() lancierà una AWTException.

Perfetto! Ora la nostra applicazione ha una sua icona nella tray-area di sistema. Sì, ma cosa farci?
Come si diceva prima, si possono configurare gli opportuni Listener, per interagire con il mouse e, cosa decisamente interessante, è possibile assegnargli un PopupMenu. Vediamo come.

Il codice parla da solo: viene creato un nuovo PopupMenu ed un nuovo elemento, con etichetta “Esci”, che ha la funzione di terminare l’applicazione. Tale elemento viene poi aggiunto al menu, che viene impostato come PopupMenu proprio della TrayIcon.

Ora vediamo invece come utilizzare un Listener di eventi. Vogliamo, ad esempio, fare in modo che l’icona reagisca al doppio click del mouse. Una cosa che potrebbe fare è mostrare un messaggio nel modo stabilito dal sistema. Avete presente i messaggi all’interno di un fumetto che compaiono quando un processo, che ha un icona nella traybar di Windows, vuole dirci qualcosa? Bene, noi possiamo mostrarli all’utente con il metodo displayMessage() della classe TrayIcon.

Il metodo displayMessage() ci permette di specificare, oltre al nostro messaggio ed alla sua intestazione, anche una tipologia che ne definisce il comportamento. Ovviamente, il risultato di tale comportamento varia da sistema a sistema.

E questo è quanto! O almeno, è quanto basta per accedere alle funzionalità basilari della tray-area messe a disposizione da Java 6. Per ulteriori informazioni, vi rimando alle Javadoc ufficiali.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *