Поддержка локального меню Swing для MacOS X на Java
Выделяемая ссылка 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());
}
}
});
}
Первый пункт меню на строке меню должен отображаться как "тест", к сожалению, это не так. С другой стороны, меню файлов отлично работает. Любые идеи?
Ответы
Ответ 1
@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 в другой файл.
Ответ 2
Вам необходимо установить системное свойство "com.apple.mrj.application.apple.menu.about.name" в основном потоке, а не в потоке Swing (другими словами, просто сделайте его первой строкой в программа).
Ответ 3
Как я понимаю, вы хотите переименовать свое меню приложений, показанное в строке меню os x. Ну, я не нашел системного свойства, но нашел вариант командной строки:
-Xdock:name="YourNameHere"
который работал у меня.
BTW: свойство syystem com.apple.mrj.application.apple.menu.about.name предназначено для переименования пункта меню в меню вашего приложения, а не самой панели меню
См. эту ссылку здесь (старая ссылка, вероятно, был убит когда-то после приобретения оракула).
Ответ 4
Вы также можете использовать Macify при создании приложения, поэтому вам не нужно менять какой-либо код.
Ответ 5
@Matt: К сожалению, это не сработало для меня.
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();
}
});
}
Это то, что я пробовал в дополнение к вашему комментарию.
Ответ 6
Если вы хотите доставить приложение, которое выглядит на родном компьютере Mac OS X, важной частью является предоставление пакета приложений. В рамках пакета приложений вы сможете предоставить файл списка свойств, чтобы решить эту проблему.
Некоторая официальная информация: Руководство по разработке Java для Mac OS X
Ответ 7
Если вы запускаете несколько JFrames и используете меню mac, тогда один из JFrames может заменить JFrame, который вы хотите, с тем, у которого есть другая структура меню. Я не уверен, что вы можете поделиться одним JMenuBar для нескольких JFrames, но вы могли бы просто создать манифест приложения, который создает все кадры.
Ответ 8
для любого заинтересованного, хотя этот вопрос составляет 6 лет, у меня была такая же проблема. Качающиеся меню не отображаются на встроенной панели mac.
Я нашел более легкое и более прямое решение...
Просто добавьте в свой JFrame компонент Java.awt Menu вместо JMenu, и он будет автоматически отображаться в основном меню!