tabPane.getTabs().remove(tab) 不调用侦听器



我一直在看这个stackoverflow帖子。他们说tabPane.getTabs().remove(tab)不会在关闭选项卡的事件中触发侦听器,这是有意义的。

因此,我将他们的解决方案应用于我的问题(我理解原理,但不理解代码),但是我的侦听器永远不会被调用。既不是tabPane.getTabs().remove(tab)也不是closeTab(tab),方法closeTab定义如下:
private void closeTab(Tab tab) {
EventHandler<Event> handler = tab.getOnClosed();
if (null != handler) {
handler.handle(null);
} else {
tab.getTabPane().getTabs().remove(tab);
}
}

打电话给我的听众。但是,当我用鼠标关闭选项卡时,侦听器会被调用。

这是我的听众:

private static void addListenerOnClosingTab(Tab tab) {
tab.setOnCloseRequest(new EventHandler<Event>()
{
@Override
public void handle(Event arg0)
{
Util.loggerControllerDiagram.info("Tab " + tab.getText() + " closed.");
}
});
}

这些方法(在这篇文章的其他当前答案中,或者在你链接的原始帖子中)对我来说都没有意义。有可能我没有理解你想要做什么。

如果你想响应一个被删除的选项卡,不管它是通过用户点击选项卡关闭按钮被删除的,还是通过编程方式操作选项卡窗格的选项卡列表被删除的,通常的方法是用选项卡列表注册一个侦听器:

private TabPane tabPane ;
// ...
tabPane.getTabs().addListener((Change<? extends Tab> c) -> {
while (c.next()) {
if (c.wasRemoved()) {
for (Tab tab : c.getRemoved()) {
System.out.println("Tab " + tab.getText() + " closed.");
}
}
}
});

你可能想在你的方法closeTab:

中使用getOnCloseRequest而不是getOnClosed
EventHandler<Event> handler = tab.getOnCloseRequest();
handler.handle(null);
tab.getTabPane().getTabs().remove(tab);