Vaadin - 从其父组件中删除组件

5
在 Vaadin 框架(v7.1.9)中,如何将 Component 从其父级中删除?
我只知道 removeComponent 函数,但需要获取父级的句柄(很丑陋):
ComponentContainer parent = (ComponentContainer) child.getParent();
parent.removeComponent(child);

我试图只是分离子元素,但这只是从“应用程序”中删除了它,而没有从UI中删除组件


1
这是做法。 - Henri Kerola
你为什么认为这很丑陋?这就像从集合(HashSetArrayList...)中移除一个元素。 - raffael
1
好的,我喜欢HashSet/ArrayList的比较。然而,在使用HashSetArrayList时,您不需要进行强制类型转换。remove被定义在Collection中。在Vaadin中,removeComponent被定义在ComponentContainer中。但是Component.getParent()返回的是一个HasComponents对象。对我来说,这要么是API的缺陷,要么就不是我想要做的事情的正确方法。你们觉得呢? - Sean Connolly
老实说,我没有检查接口,但这是一个很好的观点。我认为原因是一些父组件正在实现SingleComponentContainer而不是HasComponents。例如Panel。但我不仅仅在Vaadin上工作,也在使用它。请问您在什么情况下有一个组件却不知道它的父组件呢? - raffael
在Java集合比较中,如何获取子元素的父集合?这是完全不同的情况。我认为您应该从布局类中删除组件,在那里您只需调用removeComponent方法而无需进行任何转换。 - alaster
2个回答

4

如果将 Child 添加到任何布局中,您应该将其强制转换为该布局,例如,如果将 child 添加到 AbsoluteLayout,则:

AbsoluteLayout parent = (AbsoluteLayout ) child.getParent();
parent.removeComponent(child);

试试这个


如果这个答案解决了您的问题,请将其选择为答案。 - Mubasher

3
如果子项被添加到布局中,可以像这样实现。
Layout parent = ( Layout ) child.getParent();
parent.removeComponent(child)

我认为这个解决方案比Mubasher解决方案更好,因为它与实现无关,也就是说你不需要知道父布局,如果父布局改变了,代码仍然可以运行。


3
出于同样的原因,我认为我的原始代码更好。ComponentContainer是最低级别的接口,也是指定 removeComponent 方法的接口,因此这是最可靠的强制类型转换。但是,我已经决定这是 Vaadin API 的缺陷,需要进行类型转换。这就是真正的答案 =\ - Sean Connolly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接