Как переместить мой JMenuBar в строку меню экрана в Mac OS X? - PullRequest
6 голосов
/ 21 января 2012

Когда я перемещаю свой 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);
}

Ответы [ 3 ]

11 голосов
/ 22 января 2012

В зависимости от того, когда это будет сделано, установка свойства после может привести к тому, что ваша программа запустится слишком поздно, чтобы быть эффективной. Вместо этого добавьте параметр во время запуска.

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

В качестве альтернативы, установите свойство в Info.plist пакета вашего приложения, как описано в Параметры развертывания Java для Mac OS X , Java Dictionary Info.plist Ключи , Сведения о ключах Info.plist и Свойства системы среды выполнения Java .

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

Приложение: Как показано ниже, проблема не появляется при использовании подхода, предложенного @Urs Reupke или мной. Ваш (отсутствует) DesktopMain может быть виноват.

Screen capture

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);
            }
        });
    }
}
3 голосов
/ 22 января 2012

В качестве альтернативы тому, что предлагает trashgod, делайте то, что вы делаете, - но делайте это очень рано, прежде чем инициализировать свой пользовательский интерфейс.

Кроме того, вы можете использовать это для отображения названия вашего приложения на панели:

    System.setProperty("com.apple.mrj.application.apple.menu.about.name", "MyApplication");
0 голосов
/ 27 ноября 2016

Для Java 8 используйте это

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