我想将事件处理程序添加到选项卡上下文菜单中。选择选项卡上下文菜单后,我想从节点中删除事件处理程序。问题是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((函数会导致空指针异常,而且似乎我也误解了该函数的作用。我想获取选项卡的"标题"。
但问题仍然是一样的。如何将事件侦听器添加到选项卡中,并在第一次选择后从中删除事件侦听器。就这样。
您可以将侦听器值设置为 null
例如:
tab1.setOnSelectionChanged((e)->{
if(tab1.isSelected()){
tab1.setOnSelectionChanged(null);
}
});