Как создать меню 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));