Suele ser importante que las aplicaciones que hagamos sean fáciles de usar. Para eso es importante que su apariencia sea familiar y se comporten como el resto de aplicaciones.
Java es un lenguaje multiplataforma y de por sí se encarga de muchas de las tareas, pero hay otras no resueltas que podemos implementar nosotros y otras que están resueltas pero hay que utilizarlas y tenerlas encuenta.
Sobre este tema hay un artículo muy bueno en inglés: Make your Swing app go native (parte 2 y parte 3).
Y a continuación voy a comentar algunos consejos adicionales.
El look & feel
Lo primero de todo que deberíamos hacer en nuestra aplicación Swing es establecer que Swing utilice el look & feel del sistema. Basta esta línea de código:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
Sin embargo el look & feel para Windows antes de la versión Java SE 6 no es tan bueno como se espera. En caso de estar ejecutándolse una versión anterior a Java 6 podríamos optar por utilizar WinLaf.
También ocurre que el look & feel en Mac tampoco es tan bueno como podría serlo. Por ejemplo un JFileChooser en apariencia no tiene nada que ver con el cuadro de diáolo nativo de la interfaz Mac. Para solventar esto podemos detectar si la aplicación está funcionando en MacOS X y en ese caso cargar el look & feel Quaqua (hay una versión que sólo modifica el selector de ficheros).

Atajos de teclado
Otra cosa que deberemos tener en cuenta es que mientras en Windows/Linux se suele utilizar la tecla Control para los atajos de teclado, mientras que en MacOS X se utiliza habitualmente la tecla Comando. Por ejemplo en una opción de menú en vez de hacer lo siguiente:
JMenuItem m = new JMenuItem("Copy");
m.setAccelerator(KeyStroke.getKeyStroke('C', InputEvent.CTRL_MASK, false));
Deberíamos hacer lo siguiente:
JMenuItem m = new JMenuItem("Copy");
m.setAccelerator(KeyStroke.getKeyStroke('C', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false));
Este código en Windows o Linux creará una opción de menú que se activa con Control+C y el mismo código en MacOS X creará una opción de menú que se activa con Comando+C. La magia está en el método getMenuShortcutKeyMask().
Empaquetado
Podemos empaquetar nuestra aplicación en un archivo JAR ejecutable. Sin embargo esto no es una muy buena opción ya que
- Presuponemos que el usuario tiene la máquina virtual instalada
- Asumimos que la extensión “.jar” está asociada a la máquina virtual
- No podemos personalizar el icono del archivo
Para solventar esto contamos con diversas herramientas que permiten crear un “.exe” en Windows a partir de un archivo JAR. Por ejemplo launch4j. Este software tiene muchas características, entre las que destacan:
- Poder hacer un splash screen.
- Detecta la máquina virtual y su versión.
- Si la versión de la JVM no es la adecuada o no se encuentra permite definir un mensaje dirigido al usuario y un enlace a la descarga de la máquina virtual.
- Permite definir un icono personalizado para el ejecutable.
- La herramienta se puede ejecutar desde línea de comandos, lo cual permite automatizar la tarea de empaquetado mediante scripts.
Eso en cuanto a Windows. También desearemos crear un ejecutable para MacOS X. En tal caso podemos utilizarJarBundler que permite crear un “.app” a partir de un archivo JAR. Y después podemos empaquetar ese ejecutable en unarchivo DMG desde ant.
En Linux no conozco ninguna forma estándar de crear un ejecutable. Sin embargo siempre deberíamos ofrecer la posibilidad de ejecutar la aplicación a través de un archivo JAR ejecutable estándar. Así facilitaríamos la vida a algunos usuarios (Windows, Mac) y al resto no les quitaríamos ninguna facilidad.
Fuente: http://www.debugmodeon.com/item/811/aplicaciones-swing-con-apariencia-nativa