Java e Mac OS X
In questo articolo vediamo come ottimizzare i nostri programmi Java per il sistema operativo di Apple.
La barra menu
Una delle caratteristiche di Mac OS è la barra menu nel lato superiore dello schermo, barra “condivisa” da tutti i programmi. Purtroppo di default le applicazioni Java il menu lo hanno all’interno della loro finestra (frame). Come rimediare? Ci sono almeno due metodi, uno a tempo di compilazione ed uno a tempo di esecuzione.
Il primo metodo consiste nel chiamare setProperty con la giusta property settata a true:
1 2 3 4 |
public static void main(String[] args) { System.setProperty("apple.laf.useScreenMenuBar", "true"); ... } |
L’alternativa invece consiste nel lanciare il programma passando la seguente stringa alla java virtual machine:
1 |
java mia_classe_main: -Dcom.apple.macos.useScreenMenuBar=true |
Personalmente preferisco il primo metodo, così si evita di dover passare il parametro ogni volta. Su Linux e Windows (e altri sistemi java-compatibili) la property apple.laf.useScreenMenuBar non esiste e verrà semplicemente ignorata. Ed ecco il risultato:
Il nome dell’applicazione ed il menu nome programma
Su Mac OS X la prima voce che appare nella barra menu (dopo il menu Apple) è il nome dell’applicazione. Questa voce contiene un vero e proprio menu:
Se il vostro programma ha una finestra delle preferenze questa dovrebbe trovarsi in questo menu perchè è lì che l’utente la andrà a cercare (stesso discorso per le voci “About” ed “Esci”). Provando a far partire il nostro programma però abbiamo una brutta sorpresa:
Invece del nome del programma abbiamo il path della classe che contiene il main e manca la voce delle preferenze. La finestra di about invece è una finestra predefinita che non contiene altro se non il “nome” dell’applicazione. Per usare un “nome programma” personalizzato è necessario chiamare la java virtual machine in questo modo:
1 |
java mia_classe_main: -Xdock:name="Nome del programma" |
Per maneggiare il menu nome programma invece è necessario usare le classi contenute nel package com.apple.eawt, in particolare la classe Application:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import com.apple.eawt.*; ... ... // ottengo un oggetto che rappresenta l'applicazione in esecuzione Application myApp = Application.getApplication(); // abilito la voce "Preferences" del menu myApp.setEnabledPreferencesMenu(true); // gestore degli eventi myApp.addApplicationListener(new ApplicationAdapter() { // metodo chiamato quando si clicca su "About" public void handleAbout(ApplicationEvent e) { // qui mettere il codice per // far mostrare la propria finestra di about e.setHandled(true); } // metodo chiamato quando su clicca su "Preferences" public void handlePreferences(ApplicationEvent e) { // qui mettere il codice per // far mostrare la propria finestra delle preferenze } // metodo chiamato quando si clicca su "Quit" // gli altri eventi (Hide e Hide Others) // sono gestiti dal sistema operativo public void handleQuit(ApplicationEvent e) { System.exit(0); } }); |
Questioni di mele
Su Mac OS il tasto principale usato per le scorciatoie è il tasto Command (meglio conosciuto come “tasto mela”) mentre su Linux e Windows si usa CTRL. Per scoprire a runtime qual è il tasto principale si può usare il metodo getMenuShortcutKeyMask:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// "scopro" il tasto principale da usare nelle scorciatoie int menuShortcutKeyMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); JMenuItem save = new JMenuItem("Salva"); JMenuItem saveAs = new JMenuItem("Salva con nome"); // menu salva: CTRL/COMMAND + S save.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_S, menuShortcutKeyMask)); // menu salva con nome: CTRL/COMMAND + SHIFT + S saveAs.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_S, menuShortcutKeyMask | ActionEvent.SHIFT_MASK)); |
Maggiori informazioni sull’argomento si possono trovare sul sito di Apple, nella sezione dedicata a java.