Java 1.8中Swing应用程序菜单名称未正确显示

5

好的,我之前做过Swing应用程序,如果想要在应用程序菜单上显示不同的名称(通常在Mac上有“Preferences”和“Quit”选项),必须使用:System.setProperty(“com.apple.mrj.application.apple.menu.about.name”,“App name”);并且必须在创建JFrame之前执行。我已经这样做了,但它仍然显示我的Main类名称作为菜单名称,就好像我根本没有写那行代码一样。我在Google上搜索了这个问题,但没找到有用的信息,然后我在这里搜索了一下,但每个遇到类似问题的人都是运行Java 1.5、1.6或1.7。所以我想也许与我的当前Java版本1.8有关。

这个这个这个都没有起作用。这个这个这个要么将我发送到过时的信息,要么链接不再起作用。另外,我正在运行Mac 10.8。

任何建议/答案将不胜感激。

一个更新:

这是我最初的代码:

package bouncing_off_axes;

/**
 * This is the driver class of this program.
 * 
 * @author Mason 
 *
 */

public class Main {

    /**
     * The driving method.
     * 
     * @param args
     */

    public static void main(String[] args) {

        System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Physics Engine Practice - Bouncing Balls");
        SimulationController view = new SimulationController("Test");

    }

}

以下是trashgod提供给其他人的解决方案:

package bouncing_off_axes;

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JPanel;

    /** @see https://dev59.com/5l_Va4cB1Zd3GeqPUYkC */
    public class NewMain {

        public static void main(String[] args) {
            System.setProperty("apple.laf.useScreenMenuBar", "true");
            System.setProperty(
                "com.apple.mrj.application.apple.menu.about.name", "Name");
            EventQueue.invokeLater(new Runnable() {

                @Override
                public void run() {

                    JFrame frame = new JFrame("Gabby");
                    final JPanel dm = new JPanel() {

                        @Override
                        public Dimension getPreferredSize() {
                            return new Dimension(320, 240);
                        }
                    };
                    dm.setBorder(BorderFactory.createLineBorder(Color.blue, 10));

                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(dm);
                    frame.pack();
                    frame.setLocationByPlatform(true);

                    JMenuBar menuBar = new JMenuBar();
                    JMenu fileMenu = new JMenu("File");
                    menuBar.add(fileMenu);
                    frame.setJMenuBar(menuBar);
                    frame.setVisible(true);
                }
            });
        }
    }

显然我需要10点声誉才能发布图片,所以我不能向您展示结果,但它没有成功。


1
这对我在10.9,Java 8上有效。如需更具体的帮助,请编辑您的问题以包含一个完整的示例,展示您所描述的问题。 - trashgod
@trashgod,我完全复制了您在这里发布的解决方案。唯一的区别是我的类不在默认包中,并且在代码中有引用package bouncing_off_axes。但是它没有起作用,菜单仍然显示类名而不是设置的名称。我将编辑我的帖子并放置我最初的代码和您提供的示例。此外,我想在代码中进行更改,而不是在命令行上进行更改。 - mistShaker
1
据我所知,setProperty() 方法在 Java 8 中会失败。为什么不将您的 JAR 添加到应用程序包中,例如:https://dev59.com/7m3Xa4cB1Zd3GeqPgJF9#14485964? - trashgod
啊,我明白了。我本以为可能是这样的情况。我希望不必将其添加到应用程序包中,但如果这是唯一的方法,我可能会等到实际完成我的项目再考虑它。这个特别的项目只是我在练习物理引擎,所以当我编写我打算开发的游戏时,所有的知识都可以更加清晰地记在我的脑海中。 - mistShaker
我已在下面进行了详细说明。 - trashgod
1个回答

7
在Mac OS X 10.9上使用Java 8,设置System属性。
System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Name");

似乎不能有效地更改应用程序菜单中显示的名称。仍然可用的替代方法包括以下内容:

  • By default, the application menu will display the simple name of the class specified in the java command line or the Main-Class attribute of the JAR's manifest.

     java -cp build/classes mypackage.Name
     java -jar dist/MyJar.jar
    
  • Use the -Xdock:name="Name" command line parameter.

    java -Xdock:name="Name" -cp build/classes mypackage.Main
    java -Xdock:name="Name" -jar MyJar.jar
    
  • Add the application JAR to a Mac application bundle, as shown here, an add the attribute to the Info.plist.

    <key>JVMOptions</key>
    <string>-Xdock:name=Name</string>
    

谢谢,我很感激你的帮助。 - mistShaker
我正在使用Gradle插件创建我的jar文件。是否可以使用这种方法来命名应用程序?目前它只会选择主类的名称。 - rrrocky
由于所展示的三种方法都是基于平台的机制,因此它们都是额外的语言机制。我不知道为什么不这样做;你可以在 [tag:gradle] 中询问。 - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接