我正在研究Vaadin 7中的一个项目。我需要解析布局中的所有组件并找到我需要的组件。
以上是我布局的图示。
我在蓝色垂直布局中动态创建绿色垂直布局。由于我是动态创建的,因此我不能为这些动态创建的东西提供任何实例。但是,我对所有组件都有唯一的ID。
现在我需要使用Id找到一个Combobox。我不知道如何从蓝色垂直布局解析组合框。
我所拥有的只是蓝色垂直布局的实例和组合框的Id。 而且,如果需要,我也可以使用绿色和红色布局的ID。
我需要这样的东西,但是卡住了......
Iterator<Component> iterate = blueMainLayout.iterator();
Combobox cb;
while (iterate.hasNext()) {
Component c = (Component) iterate.next();
cb = (Combobox) blueMainLayout.....;
if (cb.getId().equals(something.getId())) {
// do my job
}
}
答案 0 :(得分:11)
您必须递归检查组件。
class FindComponent {
public Component findById(HasComponents root, String id) {
System.out.println("findById called on " + root);
Iterator<Component> iterate = root.iterator();
while (iterate.hasNext()) {
Component c = iterate.next();
if (id.equals(c.getId())) {
return c;
}
if (c instanceof HasComponents) {
Component cc = findById((HasComponents) c, id);
if (cc != null)
return cc;
}
}
return null;
}
}
FindComponent fc = new FindComponent();
Component myComponent = fc.findById(blueMainLayout, "azerty");
希望有所帮助
答案 1 :(得分:2)
尽管仍然可以使用HasComponents.iterator()
com.vaadin.ui.AbstractComponentContainer
实现java.lang.Iterable<Component>
,这使得迭代更加舒适:
...
for ( Component c : layout ) {
if ( id.equals( c.getId() ) ) {
return c;
}
}
...