强制Vaadin选项卡使用CloseHandler

强制Vaadin选项卡使用CloseHandler,vaadin,Vaadin,我有一张瓦丁牌的床单。所有选项卡都可以关闭。我已经定义了一个自定义CloseHandler。当通过小x按钮关闭选项卡时,CloseHadler执行;但是,如果以编程方式关闭选项卡 TabSheet parent = (TabSheet) this.getParent(); parent.removeTab(parent.getTab(this)); 关闭处理程序不执行。是否有办法在移除选项卡之前强制执行CloseHandler 谢谢 Oliver一个解决方案是扩展选项卡类,重写remove

我有一张瓦丁牌的床单。所有选项卡都可以关闭。我已经定义了一个自定义CloseHandler。当通过小x按钮关闭选项卡时,CloseHadler执行;但是,如果以编程方式关闭选项卡

 TabSheet parent = (TabSheet) this.getParent();
 parent.removeTab(parent.getTab(this));
关闭处理程序不执行。是否有办法在移除选项卡之前强制执行CloseHandler

谢谢


Oliver

一个解决方案是扩展
选项卡类,重写
removeTab()
,强制它执行
closeHandler
。由于
TabSheet.closeHandler
是私有的,因此您需要覆盖此字段及其设置程序。Vaadin可以使事情变得更简单(将
closeHandler
更改为
protected
或提供getter),但我不认为它是一个“肮脏”的解决方案

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()上创建一个功能请求,默认情况下可能应该调用
closeHandler
。已经有了,但它已经3年了…

如果您查看,您会注意到
TabSheet
的构造函数定义了一个默认的
CloseListener
,它只调用
TabSheet.removeComponent(c)
,这就是
removeTab(Tab-Tab)
所做的。猜猜如果一个打电话给另一个会发生什么:-)。在这种情况下,我的结论是,除了自己实际调用
CloseHandler
之外,没有其他(干净、简单)的编程方式触发它的执行。谢谢您的回复<代码>选项卡。removeComponent(c)
给出了相同的行为。我希望能够通过发送CloseEvent调用CloseHandler,比如,但是我在文档中没有看到任何允许我这样做的内容。我想我必须想出一个肮脏的解决办法。。。