【问题标题】:How to get the parent MenuBar of a JavaFX Menu如何获取 JavaFX 菜单的父菜单栏
【发布时间】:2015-03-31 12:18:09
【问题描述】:

我无法在 JavaFX Menu 类中找到允许我检索父 MenuBar 的 API。非常欢迎任何提示,包括内部 API 的使用。 (JavaFX 8)

背景:通常任何JavaFX Node 都可以通过getParent() 方法为您提供它的父级。但是由于MenuMenuItem 不继承自Node,所以这种可能性不存在。 MenuItem 类(因此还有Menu 类)有两个类似的方法:

  • getParentPopup() 获得父母 ContentMenu
  • getParentMenu() 得到父母 Menu

所以我本来期待像 getParentMenuBar() 这样的东西,但它不存在。

编辑:我刚刚找到了这个 API 扩展的 jira 功能请求: https://bugs.openjdk.java.net/browse/JDK-8091154

有人找到解决方法了吗?

【问题讨论】:

  • 您的应用程序是通过编程还是通过 FXML 构建的?
  • 我们使用 FXML 作为 ui 的最大部分。

标签: java javafx scenegraph


【解决方案1】:

我想问你为什么需要从 Menu 回到 MenuBar 的访问权限,你想解决什么问题?

如本例所示,一种可能的方法是使用 Node 上的 arbitrary properties map 来存储从 Menu 到 MenuBar 的引用。

public class MenuToMenuBar extends Application {
    public static void main(String args[]) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        MenuBar bar = new MenuBar();
        stage.setScene(new Scene(bar));
        Menu menu = new Menu("Foo");

        MenuItem menuItem = new MenuItem("Baz");
        menu.getItems().add(menuItem);
        bar.getMenus().add(menu);

        // put a reference back to MenuBar in each Menu
        for (Menu each : bar.getMenus()) {
            each.getProperties().put(MenuBar.class.getCanonicalName(), bar);
        }

        menuItem.setOnAction((e) -> {
            // retrieve the MenuBar reference later...
            System.out.println(menuItem.getParentMenu().getProperties().get(MenuBar.class.getCanonicalName()));
        });
        stage.show();
    }
}

【讨论】:

  • 是的,我可以通过构建自己的映射来解决问题。由于我们使用 fxml,我们需要做一些后期处理:1) 遍历场景图并找到 MenuBar 实例,然后 2) 在 MenuBar.getMenus() 上挂接一个侦听器以保存关系。 (如果你真的对我为什么需要这个感兴趣,我们应该私下讨论这个问题,否则会使问题变得混乱。当然,我们也在评估其他可能的解决方案,它们都有自己的不足。)
猜你喜欢
  • 1970-01-01
  • 2017-01-09
  • 2011-10-17
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多