【问题标题】:Native Swing Menu Bar Support For MacOS X In JavaJava 中 MacOS X 的本机 Swing 菜单栏支持
【发布时间】:2010-09-23 08:23:50
【问题描述】:

一个突出的链接是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 年前的事了,来吧 eh ;)

标签: java swing macos


【解决方案1】:

您需要在主线程中设置“com.apple.mrj.application.apple.menu.about.name”系统属性,而不是在 Swing 线程中(换句话说,只需将其设置为程序)。

【讨论】:

    【解决方案2】:

    据我了解,您想重命名 os x 菜单栏上显示的应用程序菜单。好吧,我没有找到系统属性,但我找到了一个命令行选项:

    -Xdock:name="YourNameHere"
    

    这对我有用。

    顺便说一句:系统属性 com.apple.mrj.application.apple.menu.about.name 用于重命名应用程序菜单中的 about 菜单项,而不是菜单栏本身

    在此处查看this linkold link 可能在太阳神谕之后的某个时间被杀死)。

    【讨论】:

      【解决方案3】:

      如果您想交付一个在 Mac OS X 上看起来像本机的应用程序,一个重要的部分是交付一个应用程序包。在应用程序包中,您将能够提供属性列表文件以解决此问题。

      一些官方信息:Java Development Guide for Mac OS X

      【讨论】:

        【解决方案4】:

        @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 类放在不同的文件中。

        【讨论】:

        • 管理员刚刚将此线程合并到我的根帐户中,所以我现在已将其标记为您的正确答案:)
        • @Matt Solnit:我也有同样的问题。这个答案解决了我的问题。
        【解决方案5】:

        您也可以在构建应用程序时使用Macify,这样您就无需更改任何代码。

        【讨论】:

          【解决方案6】:

          如果您要启动多个 JFrame 并使用 mac 菜单,则其中一个 JFrame 可能会用具有不同菜单结构的 JFrame 替换您想要的 JFrame。我不确定您是否可以为多个 JFrame 共享一个 JMenuBar,但您可以创建一个所有框架都实例化的应用程序范围的菜单栏。

          【讨论】:

            【解决方案7】:

            对于任何感兴趣的人,虽然这个问题是 6 岁,但我遇到了同样的问题。 Swing 菜单不显示在 mac 本机栏中。 我找到了一个更简单,更直接的解决方案...... 只需将 Java.awt 菜单组件而不是 JMenu 添加到您的 JFrame,它就会自动显示在本机菜单栏中!

            【讨论】:

              【解决方案8】:

              谈论迟到,但我可以(令人惊讶地)确认

              System.setProperty("apple.laf.useScreenMenuBar", "true");

              ...然后在 JFrame 上设置一个 JMenuBar 工作,将菜单栏放在 macOS 首选的顶部。

              jFrame.setJMenuBar(jMenuBar);

              ...在 macOS Big Sur (11.2.3) 和 JDK 16 上运行。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-02-20
                • 2013-09-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-12-20
                • 1970-01-01
                • 2023-01-23
                相关资源
                最近更新 更多