Vaadin中布局(或组件)的生命周期?

时间:2014-08-16 01:09:54

标签: java layout vaadin lifecycle vaadin7

我在具体的布局生命周期中有什么钩子,或者通常在Vaadin 7中有什么钩子?

生命周期事件?

我想知道布局何时开始(出生)和停止(死亡)。具体来说,我怀疑我真的关心“附加”和“分离”。如果我稍后可以在用户的​​工作会话中重新显示该布局,则布局可以在屏幕上使用之前存在于屏幕之外。我认为附件是加入/离开显示的UI的过程,但我不确定。

动机:通知,以观察者模式

并不重要,但我关心生命周期的原因显示在Push pageBook of Vaadin 7中。正如那里所见,我想通知一堆用户的布局(在UI中)关于他们的小部件所代表的数据的变化。因此,每个布局都需要调用一个方法,以使用新数据更新它们的小部件。

要通知每个布局,我需要知道哪些布局实例存在并且对此类更新感兴趣。所以我保留了一系列自我注册的布局。基本上是Observer pattern。 Push页面显示了这样的注册表集合。

缺少的部分:在Layout的代码中,我在哪里进行布局实例注册并取消注册?我想我可以使用Java构造函数和finalize方法。但我怀疑我真的希望注册围绕附加和分离事件。

附加/分离事件

Layout doc列出了许多附加/分离侦听器和attach / detach方法。我不确定我应该使用哪种,如果有的话。

1 个答案:

答案 0 :(得分:2)

你的假设是正确的。当组件获得父组时,它将附加到UI(或通常是会话)。所以这个组件与客户端相关(但它现在可能在客户端中不可见)。

解决此问题的一种方法是覆盖attach()和/或detach()来激活您注册/注销的逻辑。

或为AttachListener

添加附加和分离的监听器:addAttachListener
    def layout = new VerticalLayout()
    layout.addAttachListener(new ClientConnector.AttachListener() {
        @Override
        void attach(ClientConnector.AttachEvent attachEvent) {
            println "Attach: $attachEvent"
        }
    })
    layout.addDetachListener(new ClientConnector.DetachListener() {
        @Override
        void detach(ClientConnector.DetachEvent detachEvent) {
            println "Detach: $detachEvent"
        }
    })