在JavaFX中切换菜单项

时间:2018-07-24 20:45:56

标签: java javafx

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

默认情况下,我不会禁用(例如,打开/保存文件并运行模拟)等专门操作。当用户运行该应用程序时,他们可以在菜单“文件”>“新建”>中选择一个项目,然后根据他们选择的组件来选择适当的菜单选项。

我打算通过使每个组件列出要打开的项的列表,然后在创建组件时激活适当的项来做到这一点。

但是,我无法从功能内访问菜单列表(试图用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);
                }
            });
        }
    }

}

1 个答案:

答案 0 :(得分:0)

当您在匿名类中使用this时,它实际上是指匿名类实例。因此,在您的情况下,thisEventHandler的实例,这就是为什么您可以调用的方法这么少的原因(因为它是接口类型)。

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

在旁注中,如果您用lambda表达式替换该匿名类,那么this的意思是YourExtendedMenuBar。至少不能直接访问lambda表达式表示的类的任何成员。

P.S。我不知道您的切换到底是什么,所以直到我弄清您的意思我才能回答。