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

tabPane.getTabs().remove(tab) doesn't call listener

我已经 reading this Whosebug post。他们说 tabPane.getTabs().remove(tab) 不会在关闭标签页的事件中触发侦听器,这是有道理的。

因此,我将他们的解决方案应用到我的问题中(我理解原理,但不是真正的代码),但我的监听器永远不会被调用。方法 closeTabtabPane.getTabs().remove(tab)closeTab(tab) 都不是这样定义的:

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.");
            }
        });
    }

您可能希望在您的方法中使用 getOnCloseRequest 而不是 getOnClosed closeTab:

EventHandler<Event> handler = tab.getOnCloseRequest();
handler.handle(null);
tab.getTabPane().getTabs().remove(tab);

None 这些方法(在这个 post 中的其他当前答案中,或者在您链接的原始 post 中)对我来说真的很有意义。可能我不明白你在做什么。

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

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.");
            }
        }
    }
});