首页 > 解决方案 > 将事件处理程序添加到选项卡上下文菜单会引发空指针异常

问题描述

我想将事件处理程序添加到选项卡上下文菜单中。在选择选项卡上下文菜单后,我想从节点中删除事件处理程序。问题是Tab2.getContextMenu().addEventHandler(Event.ANY,handler);抛出一个NullPointerException.

@FXML Tab Tab2;- Tab2 可以在我的 fxml 中找到 fx:id="Tab2"

EventHandler<Event> handler = (new EventHandler<Event>() {
            public void handle(Event event) {
                System.out.println("Tab2 is selected!");
                Tab2.getContextMenu().removeEventHandler(Event.ANY, this);
            }
});
Tab2.getContextMenu().addEventHandler(Event.ANY, handler);

代码发生在initialize函数中。

我想实现这样的类似解决方案:

    Tab2.setOnSelectionChanged(e -> {
        if(Tab2.isSelected()) {
            System.out.println("Tab2 is selected!");
        }
    });

不幸的是,使用此解决方案,它将一直在选择时运行。但我希望它只发生一次,并删除事件监听器。

这个提问者使用了和我类似的解决方案: 如何删除事件处理程序?

但他对添加事件处理程序没有任何问题。

编辑:

似乎 getContextMenu() 函数会导致空指针异常,而且我似乎也误解了该函数的作用。我想得到标签的“标题”。

但问题仍然是一样的。如何将事件侦听器添加到选项卡,并在第一次选择它后从中删除事件侦听器。就这样。

标签: javafxtabsevent-handlingaddeventlistener

解决方案


您可以将侦听器值设置为 null

例如:

tab1.setOnSelectionChanged((e)->{
    if(tab1.isSelected()){
        tab1.setOnSelectionChanged(null);
    }
});

推荐阅读