2008-11-20 13 views
16

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 nombre del paquete en lugar del 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.Native Swing Menu Bar Soporte para MacOS X En Java

He aquí 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 de menú en la barra de menú debe aparecer como "prueba", por desgracia, este no es el caso. El menú de archivo funciona bien, por otro lado. ¿Algunas ideas?

+2

ooh analizar todas estas excepciones – brendan

+0

@brendan esto fue hace 4 años, vamos eh;) – Kezzer

Respuesta

21

@Kezzer

creo ver lo que está pasando. Si coloca el método main() en una clase diferente , entonces todo funciona. Entonces necesita 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.

+0

Los administradores simplemente se fusionaron este hilo en mi cuenta de root por lo He marcado esto como la respuesta correcta para usted ahora :) – Kezzer

+0

Merci beaucoup :-) –

+0

@Matt Solnit: También tuve el mismo problema. Esta respuesta resolvió mi problema. –

9

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 en el programa).

3

Según tengo entendido, quiere 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" 

que funcionó para mí.

Por cierto: El com.apple.mrj.application.apple.menu.about.name propiedad syystem es para cambiar el nombre del elemento de menú Acerca de su menú de la aplicación, no la barra de menú en sí

Ver this link aquí (la old link probablemente fue asesinado algún tiempo después de la adquisición del oráculo del sol).

+1

_Es link_ está muerto –

+1

@Ben: gracias, actualizado el enlace – dhiller

0

@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 he intentado además de su comentario.

0

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.

Algo de información oficial: Java Development Guide for Mac OS X

1

También puede usar Macify al compilar la aplicación para que no tenga que cambiar ningún código.

+1

consigo un 503 allí –

0

Si está ejecutando múltiples JFrames y utiliza el menú mac, entonces uno de los JFrames podría estar reemplazando el JFrame que desea por 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.

0

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 directa ... ¡Simplemente 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!