Встроенная поддержка панели меню 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());
            }

        }
    });
}

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

о, посмотрите на все эти исключения

brendan 10.07.2012 17:24

@brendan это было 4 года назад, да ладно;)

Kezzer 10.07.2012 18:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
17
2
21 033
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вам необходимо установить системное свойство 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, поэтому я пометил это как правильный ответ для вас :)

Kezzer 27.12.2008 18:01

@Matt Solnit: У меня тоже была такая же проблема. Этот ответ решил мою проблему.

Sandeep Kumar 03.05.2012 15:14

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

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

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

Другие вопросы по теме