2014-03-21 2 views
18

Я не могу создать JavaFX MenuBar show в качестве стандартной панели меню OS X в верхней части экрана.Как сделать OS X menubar в JavaFX

Вот что я пытался в своем подклассе Применение:

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

+0

Кто-нибудь знает, есть ли способ указать 'setUseSystemsMenuBar()' из fxml? –

+1

Да, работает в fxml – Nooblhu

ответ

7

Похоже, OS X отображает только меню, если они имеют MenuItems внутри них (что немного странно, как вы можете прикрепить функциональность пустые меню).

12

Я имел успех с этим кодом:

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)); 
5

Я создал небольшой проект, который дает вам доступ к строке меню автоматически генерируемым на OS X: NSMenuFX

Update: С новая чистая версия 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"); 

Вы также можете добавить новые пункты меню, как в своем примере выше.

+0

Работает хорошо, но замечание о -XstartOnFirstThread важно, потому что иначе вы не сможете запустить его из Eclipse. – mipa

+0

Похоже, ваш API изменился в версии «pure JavaFX» - может быть, обновите ответ? –

+0

Спасибо, что напомнили мне, код примера был обновлен. Вам также не нужно заботиться о '-XstartOnFirstThread'. –

0

Опираясь на dmolony с некоторыми исправлениями:

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)); 
1

Я просто побежал в этот вопрос сам - я заметил, что система MenuBar не будет изначально появляться в OSX, пока я не перешел в другое приложение и обратно.

Обертка setUseSystemMenuBar звонок в runLater сделал трюк, поэтому я ненаучно заключил, что перед установкой OSX можно успешно зарегистрировать меню приложения.

Platform.runLater(() -> menuBar.setUseSystemMenuBar(true)); 
Смежные вопросы