在JavaFX中切换菜单项

在JavaFX中切换菜单项,java,javafx,Java,Javafx,我创建了一个类,它扩展了JavaFX的菜单栏,为我的应用程序创建了一个菜单栏 默认情况下,我不会禁用专门的操作,例如打开/保存文件和运行模拟,它们是。当用户运行应用程序时,他们可以在菜单文件>“新建>”中选择一个项目,并根据选择的组件切换到相应的菜单选项 我计划这样做,让每个组件给出一个它切换的项目列表,然后在创建组件时激活相应的项目 但是,我无法从函数中访问菜单列表。我正在尝试使用this.getMenus访问菜单列表,但从函数中访问菜单列表是唯一可以识别为this.getClass的函数 有

我创建了一个类,它扩展了JavaFX的菜单栏,为我的应用程序创建了一个菜单栏

默认情况下,我不会禁用专门的操作,例如打开/保存文件和运行模拟,它们是。当用户运行应用程序时,他们可以在菜单文件>“新建>”中选择一个项目,并根据选择的组件切换到相应的菜单选项

我计划这样做,让每个组件给出一个它切换的项目列表,然后在创建组件时激活相应的项目

但是,我无法从函数中访问菜单列表。我正在尝试使用this.getMenus访问菜单列表,但从函数中访问菜单列表是唯一可以识别为this.getClass的函数

有人知道我为什么不能调用getMenus以及如何访问它吗? 或者,如果你对如何切换这些菜单项有更好的想法,我很乐意听听。我认为这不是一个好办法,但这是我们想出的最好的办法

private void fileNew()
{
    Menu fileNew = new Menu("New");
    menuFile.getItems().add(fileNew);

    for(String k: CLHM.keySet())
    {
        CComponent comp = CLHM.get(k);
        if(comp.supportedFeatures().contains((new SupportsNew())))
        {
            MenuItem i = new MenuItem(comp.getName());
            fileNew.getItems().add(i);

            i.setOnAction(new EventHandler<ActionEvent>()
            {
                @Override
                public void handle(ActionEvent event)
                {
                    CComponent ctemp = CLHM.get(i.getText());

                    ArrayList<String> menuItems = (ArrayList) ctemp.getMenuItems();
                    for (String s : menuItems)
                    {
                        Scanner scanner = new Scanner(s).useDelimiter("\\s>\\s");
                        String menu = scanner.next();
                        //Menu temp = this.getMenus();
                        /*
                         Here the program will parse the string of the 
                         Menu path (e.g. File>Open) and activate the
                         relevant item, if it exists.
                         */


                    }

                    borderPane.setCenter((Node) ctemp);
                }
            });
        }
    }

}
当您在匿名类中使用它时,它实际上引用了匿名类实例。在您的例子中,这是EventHandler的一个实例,这就是为什么可以调用的方法太少的原因,因为它是一种接口类型

您要查找的是您的ExtendedMenuBar.this.getMenus。这将告诉编译器您正在查找封闭实例。或者,您可以简单地删除this关键字,即getMenus。这样做将允许您使用/调用匿名类及其封闭类的任何可访问成员

另一方面,如果您用lambda表达式替换匿名类,那么这意味着您的ExtendedMenuBar。不可能访问lambda表达式表示的类的任何成员,至少不能直接访问


另外,我不知道你的切换是怎么回事,所以在我明白你的意思之前我无法回答。

menuFile.getItems做什么?非常不理想的方法!按照干净的路径,将逻辑分离到一个模型中,该模型根据任何条件决定允许哪些操作,然后将menuItems的disabled绑定到model@Sedrick它将在菜单栏的“文件”选项下添加该项。因为文件的名称空间已经很混乱,我不得不选择奇怪的名称。@kleopatra你能解释一下这是什么意思吗?