tags:

views:

1867

answers:

7

A link that stands out is http://www.devdaily.com/blog/post/jfc-swing/handling-main-mac-menu-in-swing-application/ however the menu bar under Mac OS X displays as the package name as opposed to the application name. I'm using the code in the above link without any luck, so I'm unsure if anything's changed in recent Mac OS versions.

Here's an extract:

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());
            }

        }
    });
}

The first menu item on the menu bar should display as "test", unfortunately this isn't the case. The file menu works fine, on the other hand. Any ideas?

+3  A: 

Hi Kezzer. You need to set the "com.apple.mrj.application.apple.menu.about.name" system property in the main thread, not in the Swing thread (in other words, just make it the first line in the program).

Matt Solnit
+1  A: 

As I understand you want to rename your application menu shown on the os x menu bar. Well, I didn't find a system property but I found a command line option:

-Xdock:name="YourNameHere"

that worked for me.

BTW: The syystem property com.apple.mrj.application.apple.menu.about.name is for renaming the about menu item in your application menu, not the menu bar itself

See this link here.

dhiller
A: 

@dhiller: what if I don't want to provide the application command line arguments though?

@Matt: Great, thanks. I'll try that out when I return home.

Kezzer
A: 

@Matt: Unfortunately that didn't work for me.

  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();
        }
    });
}

That's what I had tried in addition to your comment.

Kezzer
A: 

If you want to deliver an application that looks native on Mac OS X, one important part is to deliver an appplication bundle. Within the application bundle, you will be able to provide a property list file in order to solve this problems.

Some official info: Java Development Guide for Mac OS X

Vincent Robert
+3  A: 

@Kezzer

I think I see what's going on. If you put the main() method in a different class, then everything works. So you need something like:

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();
        }
    });
}

And then put your RootGUI class in a different file.

Matt Solnit
The admins just merged this thread into my root account so I've marked this as the correct answer for you now :)
Kezzer
Merci beaucoup :-)
Matt Solnit
A: 

You can also use Macify when you build the app so you don't need to change any code.

Jay Askren