javafx - 将事件处理程序添加到选项卡上下文菜单会引发空指针异常
问题描述
我想将事件处理程序添加到选项卡上下文菜单中。在选择选项卡上下文菜单后,我想从节点中删除事件处理程序。问题是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);
}
});
推荐阅读
- python - 我可以发送 **kwargs 来代替 requests.post 中的 set 参数吗?
- xslt - 您可以在 XSL 中的分组分隔符上应用样式表吗?
- sql-server - 如何使用 System.Threading.Monitor 在 powershell 中锁定对象/类型?
- python - Pandas Dataframe 将多列分成箱并绘制每个
- vue.js - 在什么阶段使用 API(vuex)处理数据?
- html - 当屏幕放大或缩小时,如何使元素保持原位?
- python - Pyinstaller PermissionError: [Errno 13] Permission denied: run.exe
- powershell - 您如何使抽象的嵌套字典/哈希表对象可读(样式)?
- docker - 赛普拉斯没有连接到本地主机
- html - HTML:想要制作一个按钮列表并且文本不会改变颜色