2012-01-21 1 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 X, Java Dictionary Info.plist Keys, About 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를 초기화하기 전에, 초기 그것을 할.

또한, 당신은 줄에 응용 프로그램의 이름을 표시하기 위해 사용하는 것이 좋습니다 : 자바 8 사용을 위해

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

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