JavaFX - 动态关闭TabPane中的Tab

Ram*_*zan 8 mouseevent tabpanel javafx-2

我有一个带可关闭标签的TabPane.我想在用户单击选项卡内容中的按钮时触发"关闭选项卡事件".以下是用户单击按钮时调用的方法:

public class CustomTab extends Tab {

    ...

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

    ....
}
Run Code Online (Sandbox Code Playgroud)

我将此自定义标签添加到tabpane中:

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);
Run Code Online (Sandbox Code Playgroud)

通常,可以通过单击选项卡标题中的(默认)关闭图标来关闭选项卡,然后"关闭!" 被打印到屏幕上.但是,当用户单击按钮(即在选项卡的内容中)并再次调用close()方法CustomTab时,"已关闭!" 打印到屏幕上,但此时标签未关闭.这不奇怪吗?

如何在单击任意按钮时关闭选项卡?

PS:tabPane.getTabs().remove(tab)有效,但触发相应的事件非常优雅.它也应该关闭标签.

小智 11

仅使用的方法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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果没有设置处理程序,则删除选项卡或调用"onClosed"处理程序.


Tom*_*ula 10

我为此打开了一个功能请求.

与此同时,如果您使用的是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();
    }
}
Run Code Online (Sandbox Code Playgroud)