在MacOSX中,JMenuBar位于顶部

4
在Netbeans中使用的Java桌面应用程序模板中,使用JMenuBar和JMenuItems创建菜单栏。
如何将该栏显示在顶部,在MacOSX中像菜单栏一样显示而不是在窗口内像Windows中一样显示?
3个回答

14

通过将类似以下内容添加到您的代码中:

if (System.getProperty("os.name").contains("Mac")) {
  System.setProperty("apple.laf.useScreenMenuBar", "true");
}

如果我使用这个参数来运行我的应用程序:-Dapple.laf.useScreenMenuBar=true,菜单栏会正确地显示在顶部,但是如果我在主方法中执行System.setProperty("apple.laf.useScreenMenuBar", "true");,它就不会显示。有什么想法吗? - pupeno
我不确定。我会尝试把它放在main()方法中作为第一段代码,或者是System.setProperty("apple.laf.useScreenMenuBar", "true");而没有if条件(例如,如果os.name包含"mac"而不是"Mac")。在我的10.5.8 Leopard上似乎可以工作。 - oold
我发现,如果我在创建JFrame之后(在main方法中的第一件事)并在创建JMenuBar或对JFrame进行任何其他修改之前放置它,它就可以工作。这是在OS X 10.8.2(Mountain Lion)下实验的。 - ArtOfWarfare
“is a Mac”的测试有点脆弱。更好的方法是测试所需功能的存在性 - 在这种情况下,是否存在Apple Java 6特定的类。 - Thorbjørn Ravn Andersen
那个测试听起来也很脆弱。你应该测试Aqua外观是否真正被使用。如果你在使用Nimbus时设置了这个系统属性,你的应用程序将会崩溃,所以只有在使用Aqua时才设置它是很重要的。 - Hakanai
为什么需要进行 if 检查呢?如果你不在 Mac 上运行,属性不会被忽略吗? - khelwood

4

我曾经也遇到过相同的问题,但是后来我发现MenuBar需要添加到框架中:

frame.setJMenuBar(menuBar);

而不是:frame.add(jMenuBar); ,同时在主函数中加入:System.setProperty("apple.laf.useScreenMenuBar", "true");


1
截至2019年的Mojave版本,这个答案对我来说是必要的。 - Dan Eckhart

3

注意:这是过时的信息 - 需要更新的答案。

即使在OS X下,Java应用程序看起来仍然像传统的Java应用程序。

如果您想要本地的外观和感觉,您需要进行一些微调。本文系列将对其进行描述。

http://www.oracle.com/technetwork/articles/javase/javatomac-140486.html http://www.oracle.com/technetwork/java/javatomac2-138389.html

这包括设置Dock图标和文本,并与应用程序菜单集成。

我相信使用XCode的OS X“将jar包装为应用程序”实用程序会自动设置所有这些属性。


自从我写下这个答案以来,苹果已经放弃了Java,而Oracle提供的Java 7的工作方式也有所不同。我还没有在OS X下使用过Java 7。 - Thorbjørn Ravn Andersen
我已经将旧的sun.com链接更新为指向oracle网站的新链接,但文章中的图片丢失了,而这些图片是来自2003年的... - bobndrew

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