【问题标题】:Forcing a Vaadin Tabsheet to use the CloseHandler强制 Vaadin Tabsheet 使用 CloseHandler
【发布时间】:2015-12-21 17:37:56
【问题描述】:

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

 TabSheet parent = (TabSheet) this.getParent();
 parent.removeTab(parent.getTab(this));

关闭处理程序不执行。有没有办法强制 CloseHandler 在 Tab 被删除之前执行。

谢谢,

奥利弗

【问题讨论】:

  • 如果您查看sources,您会注意到TabSheet 的构造函数定义了一个默认的CloseListener,它简单地调用tabsheet.removeComponent(c),这就是removeTab(Tab tab) 所做的。猜猜如果一个叫另一个会发生什么:-)。在这种情况下,我得出的结论是,除了自己实际调用 CloseHandler 之外,没有其他(干净且简单)的方式可以以编程方式触发其执行。
  • 感谢您的回复。 tabsheet.removeComponent(c) 给出相同的行为。我希望能够通过发送像fireSelectedTabChange 这样的 CloseEvent 来调用 CloseHandler,但我在文档中看不到任何允许我这样做的内容。我想我将不得不想出肮脏的解决方案......

标签: vaadin


【解决方案1】:

一种解决方案是扩展TabSheet 类并覆盖removeTab() 以强制它执行closeHandler。由于TabSheet.closeHandler 是私有的,因此您也需要覆盖此字段及其设置器。 Vaadin 可以让事情变得更简单(将 closeHandler 更改为 protected 或提供吸气剂),但我不认为这是一个“肮脏”的解决方案。

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) 创建一个功能请求,也许应该默认调用 closeHandler。 #10555 已经有了,但已经 3 岁了...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多