Как создать меню OS X в JavaFX
Я не могу показать JavaFX MenuBar как стандартную панель меню OS X, расположенную в верхней части экрана.
Вот что я пробовал в своем подклассе приложения:
public void start(Stage primaryStage) throws Exception {
final Menu menu1 = new Menu("File");
final Menu menu2 = new Menu("Options");
final Menu menu3 = new Menu("Help");
MenuBar menuBar = new MenuBar();
menuBar.getMenus().addAll(menu1, menu2, menu3);
menuBar.setUseSystemMenuBar(true);
primaryStage.setTitle("Creating Menus with JavaFX 2.0");
final Group rootGroup = new Group();
final Scene scene = new Scene(rootGroup, 800, 400, Color.WHEAT);
rootGroup.getChildren().add(menuBar);
primaryStage.setScene(scene);
primaryStage.show();
}
Я предположил, что использование
menuBar.setUseSystemMenuBar(true);
сделал бы трюк, но на самом деле это делает menuBar полностью исчезающим.
Я использую Java 1.8.0-b132 для OS X 10.9
Ответы
Ответ 1
У меня был успех с этим кодом:
MenuBar menuBar = new MenuBar ();
final String os = System.getProperty ("os.name");
if (os != null && os.startsWith ("Mac"))
menuBar.useSystemMenuBarProperty ().set (true);
BorderPane borderPane = new BorderPane ();
borderPane.setTop (menuBar);
primaryStage.setScene (new Scene (borderPane));
Ответ 2
Похоже, что OS X отображает только меню, если у них есть MenuItems внутри них (что немного странно, поскольку вы можете прикреплять функции к пустым меню).
Ответ 3
Я создал небольшой проект, который дает вам доступ к автоматически сгенерированной панели меню в OS X: NSMenuFX
Обновление: с новой чистой версией JavaFX API немного изменил
Он позволяет вам заменять элементы меню меню Mac OS по умолчанию, поэтому вы можете сделать что-то вроде этого:
// Get the toolkit
MenuToolkit tk = MenuToolkit.toolkit();
// Create default application menu with app name "test"
Menu defaultApplicationMenu = tk.createDefaultApplicationMenu("test");
// Replace the autogenerated application menu
tk.setApplicationMenu(defaultApplicationMenu);
// Since we now have a reference to the menu, we can rename items
defaultApplicationMenu.getItems().get(1).setText("Hide all the otters");
Вы также можете добавить новые пункты меню, как в приведенном выше примере.
Ответ 4
Я просто столкнулся с этой проблемой сам - я заметил, что системная меню не будет первоначально отображаться в OSX, пока я не перейду на другое приложение и обратно.
Обертка вызова setUseSystemMenuBar
в runLater
сделала трюк, поэтому я ненавязчиво завершил там больше настройки окна, прежде чем OSX сможет успешно зарегистрировать меню приложения.
Platform.runLater(() -> menuBar.setUseSystemMenuBar(true));
Ответ 5
Основываясь на дмолонии с некоторыми исправлениями:
MenuBar menuBar = new MenuBar ();
if( System.getProperty("os.name","UNKNOWN").equals("Mac OS X")) {
menuBar.setUseSystemMenuBar(true);
}
BorderPane borderPane = new BorderPane ();
borderPane.setTop (menuBar);
primaryStage.setScene (new Scene (borderPane));