2013-11-23 47 views
4

Swing)中的允許您設置菜單欄(使用JFrame.setMenuBar(mb);MenuBar的實例)。這個菜單欄可以顯示在不同的位置,具體取決於它運行的系統。如果應用程序正在運行的操作系統在屏幕頂部有一個菜單欄,則此菜單欄中通常會顯示JFrame中設置的此菜單欄。如果不支持,菜單欄將顯示在框架本身的頂部。Java:如何檢查JFrame的菜單欄是否顯示在系統菜單欄或框架本身中?

你可以看到不同的系統上不同的行爲在波紋管的例子:

MenuBar on WindowsMenuBar on Mac OS X

這是代碼的一個例子,我用它來設置菜單欄:

// Initialize a menu bar 
MenuBar mb = new MenuBar(); 

// Initialize the menu and some menu items, add these to the menu bar 
Menu m = new Menu("Menu 1"); 
MenuItem mi1 = new MenuItem("Menu Item 1"); 
MenuItem mi2 = new MenuItem("Menu Item 2"); 
MenuItem mi3 = new MenuItem("Menu Item 3"); 
m.add(mi1); 
m.add(mi2); 
m.addSeparator(); 
m.add(mi3); 
mb.add(m); 

// Set the menu bar 
setMenuBar(mb); 

我的問題是:如何檢查菜單欄是否會顯示在框架本身或系統菜單欄中(如果支持)?如果有任何可能的方法來檢查這個,而不需要初始化和定義一個菜單欄,那將會很棒。 也許這是不可能的,如果是這樣的話,是否可以在定義菜單欄後檢查相同的問題?

回答

4

如圖所示here,apple.laf.useScreenMenuBar指定了Mac OS功能,該功能在屏幕上顯示現有的JMenuBar,Mac用戶期望看到它。雖然它與應用程序無關,但只有當您將它放在那裏時才顯示菜單欄。一個合適的跨平臺謂詞可能如下所示:

if (System.getProperty("os.name").startsWith("Mac OS X")) { 
    System.setProperty("apple.laf.useScreenMenuBar", "true"); 
    System.setProperty("apple.awt.graphics.UseQuartz", "true"); 
    // etc. 
} 
+0

謝謝,這工作正常。我有一個問題,'apple.awt.graphics.UseQuartz'用於什麼?我看了一下這個頁面:'https://developer.apple。com/library/mac/documentation/java/conceptual/java14development/07-nativeplatformintegration/nativeplatformintegration.html'但它仍然不清楚。我將這兩個值都更改爲「true」和「false」,但我沒有注意到菜單的外觀有任何不同。 –

+0

這只是另一個Mac特定屬性的示例;它可能與您的應用程序無關。我使用它來改善大點的字形渲染。 – trashgod

+1

+1,對於Mac大師:) – camickr

3

是否可以在定義菜單欄後檢查相同的問題?

我只使用Windows,所以我不知道它如何在其他操作系統上工作。

我不認爲你可以找到這個信息,直到框架可見。然後,你應該能夠使用:

Point location = menuBar.getLocatonOnScreen(); 

然後你就可以比較該位置與幀的位置,看它是否包含在框架的範圍內。

if (frame.getBounds().contains(location)) 
    .... 

問題是爲什麼你需要這些信息?也許我們可以建議一種替代方法。

+0

我喜歡你的思維方式,這會起作用,但在某些情況下可能會失敗。例如,如果窗口在(0,0)處,則此方法將失敗。我正在開發一個具有自定義組件和許多特殊功能的應用程序。我想使用系統的頂部MenuBar(如果可用),如果這不可用我不想顯示此菜單,而是想顯示其他一些組件。這只是我的問題的一個基本描述,但我認爲這清楚地表明瞭我想達到的目標。順便說一句,我已經添加了示例圖片到我的問題。 –

+1

+1表示尋找替代方法;它不應該在菜單欄的顯示位置上;更多[這裏](http://stackoverflow.com/a/20165540/230513)。 – trashgod