quaqua look feel decorated and java swing osx

java - decorated - quaqua look and feel



Compatibilidad con barra de menĂºs Native Swing para MacOS X en Java (8)

Un enlace que se destaca es http://www.devdaily.com/blog/post/jfc-swing/handling-main-mac-menu-in-swing-application/, sin embargo, la barra de menú en Mac OS X se muestra como el paquete nombre en oposición al nombre de la aplicación. Estoy usando el código en el enlace anterior sin suerte, así que no estoy seguro de si ha cambiado algo en las últimas versiones de Mac OS.

Aquí hay un extracto:

public RootGUI() { super("Hello"); JMenuBar menuBar = new JMenuBar(); JMenu file = new JMenu("File"); JMenuItem item = new JMenuItem("Woah"); file.add(item); menuBar.add(file); setJMenuBar(menuBar); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(100, 100); pack(); setVisible(true); }

public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { try { System.setProperty("apple.laf.useScreenMenuBar", "true"); System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Test"); UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); new RootGUI(); } catch(ClassNotFoundException e) { System.out.println("ClassNotFoundException: " + e.getMessage()); } catch(InstantiationException e) { System.out.println("InstantiationException: " + e.getMessage()); } catch(IllegalAccessException e) { System.out.println("IllegalAccessException: " + e.getMessage()); } catch(UnsupportedLookAndFeelException e) { System.out.println("UnsupportedLookAndFeelException: " + e.getMessage()); } } }); }

El primer elemento del menú en la barra de menú debe aparecer como "prueba", desafortunadamente este no es el caso. El menú de archivo funciona bien, por otro lado. ¿Algunas ideas?


Debe establecer la propiedad del sistema "com.apple.mrj.application.apple.menu.about.name" en el hilo principal, no en el hilo Swing (en otras palabras, simplemente haga que sea la primera línea del programa).


@Kezzer

Creo que veo lo que está pasando. Si coloca el método main () en una clase diferente , entonces todo funciona. Entonces necesitas algo como:

public class RootGUILauncher { public static void main(String[] args) { try { System.setProperty("apple.laf.useScreenMenuBar", "true"); System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Test"); UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(ClassNotFoundException e) { System.out.println("ClassNotFoundException: " + e.getMessage()); } catch(InstantiationException e) { System.out.println("InstantiationException: " + e.getMessage()); } catch(IllegalAccessException e) { System.out.println("IllegalAccessException: " + e.getMessage()); } catch(UnsupportedLookAndFeelException e) { System.out.println("UnsupportedLookAndFeelException: " + e.getMessage()); } javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new RootGUI(); } }); }

Y luego ponga su clase RootGUI en un archivo diferente.


Si desea entregar una aplicación que parece nativa en Mac OS X, una parte importante es entregar un paquete de aplicación. Dentro del paquete de aplicaciones, podrá proporcionar un archivo de lista de propiedades para resolver este problema.

Alguna información oficial: Java Development Guide para Mac OS X


También puedes usar Macify cuando construyes la aplicación para que no necesites cambiar ningún código.


Si está ejecutando múltiples JFrames y utiliza el menú mac, entonces uno de los JFrames podría estar reemplazando el JFrame que desea con uno que tenga una estructura de menú diferente. No estoy seguro de si puede compartir una JMenuBar para múltiples JFrames, pero podría hacer una barra de menús amplia de la aplicación que represente todos los marcos.


@ Matt: Desafortunadamente eso no funcionó para mí.

public static void main(String[] args) { try { System.setProperty("apple.laf.useScreenMenuBar", "true"); System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Test"); UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(ClassNotFoundException e) { System.out.println("ClassNotFoundException: " + e.getMessage()); } catch(InstantiationException e) { System.out.println("InstantiationException: " + e.getMessage()); } catch(IllegalAccessException e) { System.out.println("IllegalAccessException: " + e.getMessage()); } catch(UnsupportedLookAndFeelException e) { System.out.println("UnsupportedLookAndFeelException: " + e.getMessage()); } javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new RootGUI(); } }); }

Eso es lo que había intentado además de tu comentario.


Según tengo entendido, desea cambiar el nombre del menú de la aplicación que se muestra en la barra de menú de os x. Bueno, no encontré una propiedad del sistema, pero encontré una opción de línea de comando:

-Xdock:name="YourNameHere"

eso funcionó para mí.

BTW: La propiedad del sistema com.apple.mrj.application.apple.menu.about.name es para cambiar el nombre del elemento del menú sobre el menú de la aplicación, no la barra de menú en sí misma

Vea este enlace aquí (el antiguo enlace probablemente fue asesinado en algún momento después de la adquisición del oráculo del sol).


para cualquier persona interesada, aunque esta pregunta tiene 6 años tuve el mismo problema. Los menús Swing no se muestran en la barra nativa de mac. Encontré una solución más fácil y más sencilla ... ¡Solo agregue a su JFrame un Componente de menú Java.awt en lugar de un JMenu y se mostrará automáticamente en la barra de menús nativa!