如何在JavaFX中制作OS X菜单栏

时间:2014-03-21 20:36:15

标签: javafx-2

我无法将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完全消失。

我在OS X 10.9上使用Java 1.8.0-b132

6 个答案:

答案 0 :(得分:17)

我已成功使用此代码:

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

答案 1 :(得分:9)

看起来OS X只显示Menus,如果它们里面有MenuItems(这有点奇怪,因为你可以附加功能来清空菜单)。

答案 2 :(得分:6)

我创建了一个小项目,可让您访问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");

您当然也可以像上面的例子一样添加新的菜单项。

答案 3 :(得分:2)

我自己也遇到了这个问题 - 我注意到系统菜单栏最初不会出现在OSX中,直到我切换到另一个应用程序并返回。

runLater调用包裹在Platform.runLater(() -> menuBar.setUseSystemMenuBar(true)); 中就可以了,所以我不合理地断定在OSX成功注册应用程序菜单之前需要更多的窗口设置。

{{1}}

答案 4 :(得分:1)

我成功遵循了本教程的知识:

https://blog.codecentric.de/en/2015/04/tweaking-the-menu-bar-of-javafx-8-applications-on-os-x/

下面,我粘贴最重要的部分以获得与Win classic菜单栏兼容的OS X菜单栏:

@Override
public void start(Stage primaryStage) throws Exception {
    MenuBar menuBar = new MenuBar();
    menuBar.useSystemMenuBarProperty().set(true);

    Menu menu = new Menu("java");
    MenuItem item = new MenuItem("Test");

    menu.getItems().add(item);
    menuBar.getMenus().add(menu);

    primaryStage.setScene(new Scene(new Pane(menuBar)));
    primaryStage.show();
}

答案 5 :(得分: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));