Подтвердить что ты не робот

Поддержка локального меню 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());
            }

        }
    });
}

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

4b9b3361

Ответ 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, и он будет автоматически отображаться в основном меню!