强制 Vaadin Tabsheet 使用 CloseHandler
Forcing a Vaadin Tabsheet to use the CloseHandler
我有一个 Vaadin 标签表。所有选项卡都是可关闭的。我已经定义了一个自定义的 CloseHandler。当通过小 x 按钮关闭选项卡时,CloseHadler 将执行;但是,如果我以编程方式关闭选项卡
TabSheet parent = (TabSheet) this.getParent();
parent.removeTab(parent.getTab(this));
关闭处理程序不执行。有没有办法在删除 Tab 之前强制执行 CloseHandler。
谢谢,
奥利弗
一个解决方案是扩展 TabSheet
class 并覆盖 removeTab()
以强制它执行 closeHandler
。由于 TabSheet.closeHandler
是私有的,您还需要覆盖此字段及其 setter。 Vaadin 可以使事情变得更简单(将 closeHandler
更改为 protected
或提供 getter),但我不认为它是 "dirty" 解决方案。
public class MyTabSheet extends TabSheet {
private static final long serialVersionUID = 1L;
private CloseHandler closeHandler;
@Override
public void removeTab(Tab tab) {
if (closeHandler != null) {
closeHandler.onTabClose(this, tab.getComponent());
}
super.removeTab(tab);
}
@Override
public void setCloseHandler(CloseHandler handler) {
closeHandler = handler;
// needed for TabSheet.TabsheetServerRpcImpl
super.setCloseHandler(handler);
}
}
如果您愿意,可以在 Vaadin 创建一个功能请求(vaadin.com/bug), maybe the closeHandler
should be called by default. There's already the #10555 但它已经 3 岁了...
我有一个 Vaadin 标签表。所有选项卡都是可关闭的。我已经定义了一个自定义的 CloseHandler。当通过小 x 按钮关闭选项卡时,CloseHadler 将执行;但是,如果我以编程方式关闭选项卡
TabSheet parent = (TabSheet) this.getParent();
parent.removeTab(parent.getTab(this));
关闭处理程序不执行。有没有办法在删除 Tab 之前强制执行 CloseHandler。
谢谢,
奥利弗
一个解决方案是扩展 TabSheet
class 并覆盖 removeTab()
以强制它执行 closeHandler
。由于 TabSheet.closeHandler
是私有的,您还需要覆盖此字段及其 setter。 Vaadin 可以使事情变得更简单(将 closeHandler
更改为 protected
或提供 getter),但我不认为它是 "dirty" 解决方案。
public class MyTabSheet extends TabSheet {
private static final long serialVersionUID = 1L;
private CloseHandler closeHandler;
@Override
public void removeTab(Tab tab) {
if (closeHandler != null) {
closeHandler.onTabClose(this, tab.getComponent());
}
super.removeTab(tab);
}
@Override
public void setCloseHandler(CloseHandler handler) {
closeHandler = handler;
// needed for TabSheet.TabsheetServerRpcImpl
super.setCloseHandler(handler);
}
}
如果您愿意,可以在 Vaadin 创建一个功能请求(vaadin.com/bug), maybe the closeHandler
should be called by default. There's already the #10555 但它已经 3 岁了...