Native Swing Menu Bar Поддержка MacOS X в Java - PullRequest
16 голосов
/ 21 ноября 2008

Выделяется ссылка 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());
            }

        }
    });
}

Первый пункт меню в строке меню должен отображаться как «тест», к сожалению, это не так. Меню файла работает отлично, с другой стороны. Есть идеи?

Ответы [ 7 ]

21 голосов
/ 22 ноября 2008

@ 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 в другой файл.

10 голосов
/ 21 ноября 2008

Вам необходимо установить системное свойство com.apple.mrj.application.apple.menu.about.name в основном потоке, а не в потоке Swing (другими словами, просто сделайте его первой строкой в программа).

3 голосов
/ 21 ноября 2008

Насколько я понимаю, вы хотите переименовать меню вашего приложения, показанное в строке меню os x. Я не нашел системного свойства, но нашел параметр командной строки:

-Xdock:name="YourNameHere"

, который работал для меня.

Кстати: свойство syystem com.apple.mrj.application.apple.menu.about.name предназначено для переименования пункта меню about в меню приложения, а не в самой строке меню

См. эту ссылку здесь ( старая ссылка , вероятно, была убита через некоторое время после приобретения солнца-оракула).

1 голос
/ 23 июля 2010

Вы также можете использовать Macify при создании приложения, чтобы вам не нужно было менять код.

0 голосов
/ 03 октября 2015

для всех, кто интересуется, хотя этому вопросу 6 лет, у меня была такая же проблема. Меню Swing не отображаются на родной панели Mac. Я нашел более простое и понятное решение ... Просто добавьте в JFrame компонент меню Java.awt вместо JMenu, и он автоматически отобразится в родном меню!

0 голосов
/ 09 февраля 2014

Если вы запускаете несколько JFrames и используете меню Mac, то один из JFrames может заменить нужный вам JFrame на тот, который имеет другую структуру меню. Я не уверен, что вы можете совместно использовать один JMenuBar для нескольких JFrames, но вы можете просто создать широкую строку меню, в которой будут созданы все кадры.

0 голосов
/ 21 ноября 2008

Если вы хотите доставить приложение, которое выглядит нативно в Mac OS X, одной важной частью является доставка пакета приложения. В пакете приложения вы сможете предоставить файл списка свойств для решения этой проблемы.

Некоторая официальная информация: Руководство по разработке Java для Mac OS X

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...