Как переместить мой 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);
}
3 ответа
В зависимости от того, когда это будет сделано, установка свойства после запуска вашей программы может быть слишком поздней, чтобы быть эффективной. Вместо этого добавьте параметр во время запуска.
java -Dapple.laf.useScreenMenuBar=true -jar MyApplication.jar
Кроме того, установите свойство в вашем комплекте приложений Info.plist
, как описано в разделе Параметры развертывания Java для Mac OS X, Ключи словаря Java Info.plist, Ключи About Info.plist и Свойства системы среды выполнения Java.
<key>Properties</key>
<dict>
<key>apple.laf.useScreenMenuBar</key>
<string>true</string>
...
</dict>
Приложение: как показано ниже, проблема не возникает при использовании подхода, предложенного @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://stackru.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);
}
});
}
}
Я знаю, что этот вопрос старый, но у меня сработало то, что я создал новый класс с именем Main, а затем установил системное свойство, напримерSystem.setProperty("apple.awt.application.name", "My app");
Работает в JDK14.
В качестве альтернативы тому, что предлагает trashgod, делайте то, что вы делаете, - но делайте это очень рано, прежде чем инициализировать свой пользовательский интерфейс.
Кроме того, вы можете рассмотреть возможность использования этого для отображения названия вашего приложения на панели:
System.setProperty("com.apple.mrj.application.apple.menu.about.name", "MyApplication");
Для Java 8 используйте это
System.setProperty("apple.awt.application.name", "My app");