我有一个带有可关闭标签的TabPane。我想在用户单击选项卡内容中的按钮时触发“关闭选项卡事件”。以下是用户单击按钮时调用的方法:
public class CustomTab extends Tab {
...
protected void close() {
Event.fireEvent(this, new Event(Tab.CLOSED_EVENT));
}
....
}
我将此自定义标签添加到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);
通常,可以通过单击选项卡标题中的(默认)关闭图标来关闭选项卡,然后“关闭!”被打印到屏幕上。但是,当用户点击按钮(位于标签内容中)并调用close()
CustomTab
方法时,再次“关闭!”打印到屏幕上,但此时标签未关闭。这不奇怪吗?
如何在点击任意按钮时关闭标签?
P.S。:tabPane.getTabs()。remove(tab)有效,但触发相应的事件非常优雅。它也应该关闭标签。
答案 0 :(得分:10)
我为此打开了feature request。
与此同时,如果您使用的是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();
}
}
答案 1 :(得分:9)
仅使用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”处理程序。