如何将JMenuBar移动到Mac OS X上的屏幕菜单栏?

当我将JMenuBar移动到Mac OS X上的屏幕菜单栏时,它会留下一些空白区域,菜单会出现在我的窗口中; 我需要删除那个空间。 我在用

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

将我的JMenuBar移动到屏幕菜单栏。 我的朋友使用Mac报告,如果我没有设置该属性,这将留下一些丑陋的垂直空间,菜单将驻留在该空间中。 解决此问题的最佳方法是什么?

编辑:这是我的来源的一个例子:

 public static void main(String[] args) { System.setProperty("apple.laf.useScreenMenuBar", "true"); System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Name"); JFrame frame = new JFrame("Gabby"); final DesktopMain dm = new DesktopMain(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(dm); frame.setSize(160, 144); frame.setLocationRelativeTo(null); frame.setIgnoreRepaint(true); JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("File"); menuBar.add(fileMenu); // Populating the menu bar code goes here frame.setJMenuBar(menuBar); frame.setVisible(true); } 

根据完成的时间, 程序启动设置属性可能为时已晚,无法生效。 而是在启动时添加设置。

 java -Dapple.laf.useScreenMenuBar=true -jar MyApplication.jar 

或者,在应用程序包的Info.plist设置该属性,如Mac OS X的Java部署选项Java Dictionary Info.plist KeysAbout Info.plist KeysJava Runtime System Properties中所述

 Properties  apple.laf.useScreenMenuBar true ...  

附录:如下所示,使用@Urs Reupke或我建议的方法不会出现问题。 您的(缺失的) DesktopMain可能有问题。

屏幕截图

 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 http://stackoverflow.com/questions/8955638 */ 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); } }); } } 

作为trashgod建议的替代方案,做你正在做的事情 – 但是在你初始化UI之前很早就做了。

此外,您可以考虑使用它在栏中显示您的应用程序名称:

  System.setProperty("com.apple.mrj.application.apple.menu.about.name", "MyApplication"); 

对于Java 8,请使用此选项

 System.setProperty("apple.awt.application.name", "My app");