Aplicaciones Java en Mac OS X

Autor: Jorge Carabias González

Es bien conocido que las aplicaciones Java son multiplataforma pero hay que tener en cuenta algunas consideraciones para que el funcionamiento sea el correcto. Para empezar, en Mac OS X la API de Java es ligeramente distinta a la acostumbrada por lo que es una buena práctica recompilar una aplicación Java cuando se vaya a utilizar en Mac OS X. En contrapartida, hay que decir que las aplicaciones Java en Mac OS X suelen correr bastante más ligeras y rápidas que en el resto de plataformas debido a la especial atención que Apple ha dedicado al desarrollo de la máquina virtual. Lo que voy a explicar a continuación es la manera de hacer que el L&F de una aplicación Java se adapte a la forma que adoptan las aplicaciones nativas de Mac OS X escritas, por ejemplo, en Cocoa.

Para empezar, se debe elegir una aplicación Java y comprobar su correcto funcionamiento. Si la aplicación viene empaquetada en un archivo .jar simplemente se debe hacer doble click sobre este fichero para ejecutarlo. En caso contrario se puede arrancar con la terminal escribiendo:

java nombre_paquete.nombre_clase_principal

Nada más arrancar la aplicación se comprueba que el aspecto de la misma cambia para adaptarse al look&feel Aqua de Mac OS X (Si al final lo quitan en el nuevo Leopard supongo que ya no saldrá con ese L&F). Aparentemente ya está todo hecho puesto que ya podemos utilizar la aplicación y además tiene el L&F que debe tener pero si nos fijamos en ciertos detalles veremos que se deben realizar algunas tareas adicionales.

La primera cosa en la que nos debemos fijar es en la barra de menús. Las aplicaciones nativas de Mac OS X tienen el menú de la aplicación en la barra de la parte superior de la pantalla, barra de aplicación, de manera que esta barra cambia dependiendo de la aplicación que tenga el foco. Por el contrario, las aplicaciones Java de escritorio que han sido programadas en otros entornos que carecen de esta barra como Windows y Linux, poseen el menú unido a la ventana de la aplicación. Una aplicación Java arrancada en Mac OS X seguirá teniendo el menú unido a la ventana principal de la aplicación. En la barra superior lo que aparecerá será el nombre de la clase principal de la aplicación. Afortunadamente, los mecanismos para adaptar la aplicación no necesitan cambiar el código de la aplicación. Para hacer que el menú de la aplicación aparezca en la barra superior y no con la ventana principal se debe cambiar el valor de la propiedad del sistema com.apple.macos.useScreenMenuBar. Esta acción se puede realizar al arrancar la aplicación de la siguiente manera:

java -Dcom.apple.macos.useScreenMenuBar=true nombre_paquete.nombre_clase_principal

Ahora, al arrancar la aplicación Java, en la barra superior de la pantalla aparecerá el nombre de la clase principal y el menú de la aplicación.
Aunque ya tenemos el menú en el lugar habitual de aparición de los menús en Mac OS X todavía se mantiene el nombre de la clase principal como nombre de la aplicación. Este nombre de la aplicación es el que aparece también en el icono de la aplicación arrancada en el dock por lo que resulta conviente cambiarlo al nombre real de la aplicación o, por lo menos, a uno que sea más legible. Este cambio se realiza también en el momento del arranque de la aplicación mediante el parámetro Xdock:name. De esta manera, la línea de arranque de la aplicación queda de la siguiente manera:

java -Dcom.apple.macos.useScreenMenuBar=true Xdock:name=nombre_de_la_aplicación nombre_paquete.nombre_clase_principal

Para terminar, se pueden realizar unos pequeños retoques a la interfaz gráfica con más propiedades. Por ejemplo, al pasar al tema Aqua pueden ocurrir cosas como esta:

Para que el botón de redimensionado de la pantalla no cubra parte del botón se puede utilizar la propiedad com.apple.mrj.application.growbox.intrudes. De esta manera el arranque de la aplicación quedaría de la siguiente manera:

java -Dcom.apple.macos.useScreenMenuBar=true Xdock:name=nombre_de_la_aplicación -Dcom.apple.mrj.application.growbox.intrudes=false nombre_paquete.nombre_clase_principal

y el aspecto del botón sería el siguiente:

Un par de propiedades interesantes más son com.apple.mrj.application.live-resize que muestra el nuevo tamaño de la ventana cuando se redimensiona sobre la original y com.apple.macos.smallTabs que utiliza un tamaño de fuente pequeño para el texto de las pestañas en los JTabbedPane.