Oggi stavo proseguendo la realizzazione della mia tesi che prevede, tra l’altro, la creazione di un programma in Java. Una delle peculiarità di questo linguaggio è il fatto di essere multipiattaforma, visto che gira quasi ovunque senza necessità di ricompilazioni o pesanti adattamenti.
Tuttavia ogni tanto è necessario operare dei piccoli aggiustamenti, caso che mi si è presentato (in maniera un po’ inaspettata) proprio oggi.
La mia applicazione prevede una semplice interfaccia grafica, utilizzando le note librerie Swing. Si tratta di una finestra con una visione “a schede” ed un menu. Il problema è proprio rappresentato da quest’ultimo, quando l’applicazione gira in ambiente OS X. Infatti la gestione dei menu del sistema operativo di casa Apple è leggermente diversa da quella utilizzata da Windows, KDE o Gnome. Infatti in OS X c’è un unica barra di menu sempre visibile posizionata in alto, le cui voci cambiano a seconda dell’applicazione che possiede il fuoco.
Inoltre ogni applicazione ha sempre un menu con il nome della stessa in cui compaiono le voci per accedere alle preferenze, avere le informazioni sull’applicazione, chiuderla.
Inutile dire che realizzando un menu in Java nel modo “standard” non si ha assolutamente alcuna integrazione con il menu “globale”, ma la barra di menu viene invece inserita nella finestra, come in qualsiasi sistema. Tuttavia qualche ricerca in internet permette di risolvere il problema con una sola riga:
System.setProperty(”apple.laf.useScreenMenuBar”, “true”);
La soluzione sembrava troppo semplice, però ha avuto esito positivo. Tuttavia il problema del menu predefinito non viene risolto, cosa ovviamente prevedibile (come farebbe ad esempio Java a sapere quale delle mie voci serve per accedere alle preferenze, ammesso che ci siano ?).
Ancora altre ricerche mi portano al sito Apple, dove viene descritto l’utilizzo di una libreria che promette di integrarsi perfettamente con la piattaforma di Cupertino. Tuttavia non è fornito nessun link per scaricare il JAR in questione…scopro poi che è incluso con tutte le distribuzione di Java su Mac. In sostanza quindi è sufficiente modificare il proprio codice utilizzando tale libreria per integrarsi perfettamente sulla piattaforma Mac. Rimane tuttavia un problema, ovvero la necessità di averla sempre a disposizione anche quando si lavora in altri ambiente (per consentire la compilazione del codice).
Questa soluzione non mi soddisfa affatto, e così dopo un po’ di ricerche trovo un’altra libreria che fa al caso mio: Macify (download qui). Si tratta di qualche classe da pochi Kb, che utilizza la tecnica Reflection per chiamare i metodi della libreria fornita da Apple.
La cosa interessante è che la libreria di Apple non è richiesta in compilazione. Inoltre è necessaria in esecuzione solo se viene utilizzata (quindi se ci si trova su un Mac, che però la ha già di default nella distribuzione Java).
In sostanza dunque non sempre l’integrazione tra le varie piattaforme avviene in maniera scontata, nemmeno con un linguaggio come Java. Tuttavia va ricordato che, in questo caso specifico, non si possono effettuare “miracoli”. Ovvero la JVM non può dedurre quali voci del nostro menu siano da associare a quelle predefinite (es. opzioni) e quindi è necessario un intervento manuale di questo tipo oppure la modifica del funzionamento dei menu di Swing.