JavaFX - 动态关闭TabPane中的选项卡

10

我有一个具有可关闭选项卡的TabPane。当用户点击选项卡内容中的按钮时,我希望触发一个"关闭选项卡事件"。下面是用户点击按钮时调用的方法:

public class CustomTab extends Tab {

    ...

    protected void close() {
        Event.fireEvent(this, new Event(Tab.CLOSED_EVENT));
    }

    ....
}

我将这个自定义选项卡添加到选项卡面板中:

TabPane tabPane = new TabPane();
...
CustomTab tab = new CustomTab();
tab.setOnClosed(new EventHandler<Event>() {
    @Override
    public void handle(Event t) {
        System.out.println("Closed!");
    }
});
tabPane.getTabs().add(tab);
tabPane.getSelectionModel().select(tab);

通常情况下,选项卡可以通过单击标签页标题栏中的(默认)关闭图标来关闭,并在屏幕上打印“已关闭!”。但是,当用户单击按钮(位于选项卡内容中)并调用CustomTab的close()方法时,再次打印“已关闭!”,但此时选项卡不会关闭。这不奇怪吗?
我如何在单击任意按钮时关闭选项卡?
附注:tabPane.getTabs().remove(tab)可行,但触发相应事件更加优雅。它也应该关闭选项卡。

你使用的JavaFX版本是哪个?自从8.0版本以来,就有了“TAB_CLOSE_REQUEST_EVENT”。 - zhujik
由于8.0版本不是官方版本,也没有包含在默认的jre中,所以我正在使用2.2版本。 - Ramazan
1: 正如事件名称Tab.CLOSED_EVENT所示,该事件应在选项卡关闭后触发。我的观点是文档有些模糊。2: 仅仅调用该事件并不会关闭该选项卡。您的方法tabPane.getTabs().remove(tab)是正确的。 - pmoule
2个回答

14

仅使用tabPane.getTabs().remove(tab)的方法并不完全正确,因为它如果设置了“onClosed”处理程序,就不会调用它。 我使用以下方法:

private void closeTab(Tab tab) {
        EventHandler<Event> handler = tab.getOnClosed();
        if (null != handler) {
            handler.handle(null);
        } else {
            tab.getTabPane().getTabs().remove(tab);
        }
    }

如果没有设置处理程序,则移除选项卡或调用“onClosed”处理程序。


12

我为此开了一个功能请求

与此同时,如果您正在使用Java 8且未使用自定义的TabPane皮肤,则可以使用此解决方法来模拟关闭按钮单击时发生的确切关闭行为:

import javafx.scene.control.Tab;

import com.sun.javafx.scene.control.behavior.TabPaneBehavior;
import com.sun.javafx.scene.control.skin.TabPaneSkin;

public class MyTab extends Tab {

    public void requestClose() {
        TabPaneBehavior behavior = getBehavior();
        if(behavior.canCloseTab(this)) {
            behavior.closeTab(this);
        }
    }

    private TabPaneBehavior getBehavior() {
        return ((TabPaneSkin) getTabPane().getSkin()).getBehavior();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接