【问题标题】:How to make an OS X menubar in JavaFX如何在 JavaFX 中制作 OS X 菜单栏
【发布时间】:2014-03-21 20:36:15
【问题描述】:

我无法让 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

【问题讨论】:

  • 有人知道是否有办法从 fxml 指定 setUseSystemsMenuBar() 吗?
  • 是的, 在 fxml 中工作

标签: javafx-2


【解决方案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");
    

    您当然也可以像在上面的示例中那样添加新的菜单项。

    【讨论】:

    • 工作得很好,但关于 -XstartOnFirstThread 的评论很重要,否则你将无法从 Eclipse 内部运行它。
    • 看起来您的 API 在“纯 JavaFX”版本中发生了变化——也许更新答案?
    • 感谢提醒,示例代码已更新。你也不需要关心-XstartOnFirstThread了。
    【解决方案4】:

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

    setUseSystemMenuBar 调用包装在runLater 中就可以了,所以我不科学地得出结论,在OSX 成功注册应用程序菜单之前需要进行更多的窗口设置。

    Platform.runLater(() -> menuBar.setUseSystemMenuBar(true));
    

    【讨论】:

    • 您对此有更深入的了解吗?我有一个稍微不同的问题——当我在 Java 中或从 FXML 文件中以编程方式将 useSystemMenuBar 设置为 true 时,我会在 Mac 屏幕的顶部看到菜单栏,但它不起作用。我单击菜单栏中的任意位置,没有任何反应。如果我切换到另一个应用程序,然后又回到我的应用程序,它就会开始工作。我尝试通过我的 Application.start() 方法将调用包含在 runLater 中,但同样的事情。也许我会问这个:你在哪里调用 Platform.runLater() 它对你有用?
    • 这个话题有点老了,但目前我偶然发现了同样的问题。不幸的是,建议的解决方案不起作用。我也使用 NSMenuFX,我尝试过使用和不使用应用程序菜单。我尝试直接异步设置 menuBar.setUseSystemMenuBar。不用找了。有人对此有更新吗?我正在使用 OpenJDK 14 和 JavaFX / OpenJFX 15。
    【解决方案5】:

    感谢我成功完成的本教程:

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

    下面我粘贴最重要的部分以获得与 Win 经典菜单栏兼容的 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();
    }
    

    【讨论】:

    • 这不是完整的故事。为了获得完全的兼容性,您必须使用github.com/codecentric/NSMenuFX,否则您仍然会遇到很多问题,例如您不能国际化默认菜单项。
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 2014-10-09
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多