2012-01-21 29 views
5

私は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); 
} 
+1

を:

また、あなたがバーで、アプリケーションの名前を表示するためにこれを使用して検討するかもしれませんか?通常、レイアウトはすべての部屋を使用するように自動的に調整されます。 – Eelke

答えて

11

それは後、あなたのプログラムの起動を有効にするには遅すぎるかもしれプロパティを設定し、終了したときに応じて。代わりに、起動時に設定を追加します。 Java Deployment Options for Mac OS XJava Dictionary Info.plist KeysAbout Info.plist KeysJava Runtime System Propertiesで説明したように

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

あるいは、アプリケーションバンドルのInfo.plistにプロパティを設定します。

<key>Properties</key> 
<dict> 
    <key>apple.laf.useScreenMenuBar</key> 
    <string>true</string> 
    ... 
</dict> 

補遺:以下に示すように、問題はが@Urs Reupkeまたは自分で提案されたアプローチを使用して表示されません。あなたの(不足している)DesktopMainに誤りがあるかもしれません。

Screen capture示唆するものtrashgod、あなたがやっている何をすべきかの代替案として

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); 
      } 
     }); 
    } 
} 
+0

trashgod、そうは思わしくない - 私は自分のコードでやっているし、まだ苦情を聞いていない。 –

+0

@UrsReupke:良い点;編集されました。私は効果を再現することはできませんが、私は[this](http://stackoverflow.com/a/1654547/230513)のようなレポートを見ました。 – trashgod

+0

+1は余分です。 –

3

- しかし、あなたはあなたのUIを初期化する前に、非常に早い段階でそれを行います。あなたは、コードを投稿できる

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

+1 tnecniv:あなたが説明している問題を示す[sscce](http://sscce.org/)を提供してください。 – trashgod

+0

@trashgod私のソースの例を追加しました – tnecniv

+0

@tnecniv:私はここで精緻化しました(http://stackoverflow.com/a/8956715/230513)。 – trashgod

0

のJava 8の使用については、この

System.setProperty("apple.awt.application.name", "My app"); 
関連する問題