Native Swing Menu Bar Support For MacOS X In Java

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?

Answers


@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.


Need Your Help

Accessing Instance Variable from Controller In View

ruby-on-rails variables view instance

I am very new to Rails so this will probably seem basic to most of you. I am having trouble getting instance variables from one of my controller methods to show in my view. I am trying to get the...

what's the “best” approach to creating the UI of an audio plugin that will be both audio unit and VST for OS X and Windows?

windows osx core-audio audiounit vst

I'm working on a couple audio plugins. Right now, they are audio units. And while the "DSP" code won't change for the most part between implementations / ports, I'm not sure how to go about the GUI...

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.