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

Javafx 2 JavaFX-动态关闭TabPane中的选项卡,javafx-2,mouseevent,tabpanel,Javafx 2,Mouseevent,Tabpanel,我有一个带有可关闭选项卡的选项卡窗格。我想在用户单击选项卡内容中的按钮时触发“关闭选项卡事件”。以下是用户单击按钮时调用的方法: public class CustomTab extends Tab { ... protected void close() { Event.fireEvent(this, new Event(Tab.CLOSED_EVENT)); } .... } 我将此自定义选项卡添加到选项卡窗格中,如下所示: TabPa

我有一个带有可关闭选项卡的选项卡窗格。我想在用户单击选项卡内容中的按钮时触发“关闭选项卡事件”。以下是用户单击按钮时调用的方法:

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);
TabPane TabPane=new TabPane();
...
CustomTab=新的CustomTab();
tab.setOnClosed(新的EventHandler(){
@凌驾
公共无效句柄(事件t){
System.out.println(“关闭!”);
}
});
tabPane.getTabs().add(tab);
tabPane.getSelectionModel().select(选项卡);
通常,可以通过单击选项卡标题中的(默认)关闭图标来关闭选项卡,并将“关闭!”打印到屏幕上。但是,当用户单击按钮(即选项卡内容中的按钮)并调用
CustomTab
close()
方法时,屏幕上再次显示“Closed!”,但这次选项卡没有关闭。这不是很奇怪吗

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


注意:tabPane.getTabs().remove(tab)可以工作,但触发相应的事件要优雅得多。它还应该关闭选项卡。

仅使用
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);
        }
    }
private void closeTab(选项卡){
EventHandler=tab.getOnClosed();
if(null!=处理程序){
handler.handle(null);
}否则{
tab.getTabPane().getTabs().remove(tab);
}
}
如果没有设置处理程序,则删除该选项卡,或者调用“onClosed”处理程序。

我为此打开了一个对话框

同时,如果您使用Java 8而不使用自定义选项卡窗格外观,则可以使用此解决方案模拟单击关闭按钮时发生的确切关闭行为:

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();
    }
}

您使用的是哪个javafx版本?自8.0以来,有一个“TAB_CLOSE_REQUEST_EVENT”(TAB_CLOSE_REQUEST_事件),因为8.0不是官方的,也不包含在默认的jre中,我使用的是2.2.1:正如事件的名称
TAB.CLOSED_EVENT
所示,该事件应该在TAB关闭后触发。我觉得这个有点模糊。2:仅调用事件不会关闭选项卡。调用
tabPane.getTabs().remove(tab)
的方法是正确的。