Выделяется ссылка http://www.devdaily.com/blog/post/jfc-swing/handling-main-mac-menu-in-swing-application/, однако в строке меню Mac OS X отображается имя пакета, а не имя приложения. Я безуспешно использую код из приведенной выше ссылки, поэтому я не уверен, изменилось ли что-нибудь в последних версиях Mac OS.
Вот выдержка:
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());
}
}
});
}
Первый пункт меню в строке меню должен отображаться как «тест», но, к сожалению, это не так. С другой стороны, файловое меню работает нормально. Есть идеи?
@brendan это было 4 года назад, да ладно;)




Вам необходимо установить системное свойство com.apple.mrj.application.apple.menu.about.name в основном потоке, а не в потоке Swing (другими словами, просто сделайте его первой строкой в программе).
Насколько я понимаю, вы хотите переименовать меню своего приложения, отображаемое в строке меню OS X. Ну, я не нашел системного свойства, но нашел параметр командной строки:
-Xdock:name = "YourNameHere"
это сработало для меня.
Кстати: свойство syystem com.apple.mrj.application.apple.menu.about.name предназначено для переименования элемента меню about в меню вашего приложения, а не самой строки меню
См. Здесь эта ссылка (старая ссылка, вероятно, был убит через некоторое время после захвата солнца-оракула).
Если вы хотите предоставить приложение, которое выглядит нативно в Mac OS X, одной важной частью является доставка пакета приложений. В пакете приложений вы сможете предоставить файл со списком свойств для решения этой проблемы.
Некоторая официальная информация: Руководство по разработке на Java для Mac OS X
@Kezzer
Думаю, я понимаю, что происходит. Если вы поместите метод main () в другой класс, тогда все будет работать. Итак, вам нужно что-то вроде:
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();
}
});
}
А затем поместите свой класс RootGUI в другой файл.
Администраторы только что добавили эту ветку в мою учетную запись root, поэтому я пометил это как правильный ответ для вас :)
@Matt Solnit: У меня тоже была такая же проблема. Этот ответ решил мою проблему.
Вы также можете использовать Macify при создании приложения, поэтому вам не нужно менять какой-либо код.
Если вы запускаете несколько JFrames и используете меню Mac, то один из JFrames может заменять нужный JFrame на другой с другой структурой меню. Я не уверен, что вы можете использовать один JMenuBar для нескольких JFrames, но вы можете просто создать широкую строку меню приложения, в которой будут созданы все кадры.
для всех, кто интересуется, хотя этому вопросу 6 лет, у меня была такая же проблема. Меню Swing не отображаются на собственной панели Mac. Я нашел более простое и понятное решение ... Просто добавьте в JFrame компонент меню Java.awt вместо JMenu, и он автоматически отобразится во встроенной строке меню!
о, посмотрите на все эти исключения