8

我正在 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
        }
    }
4

2 回答 2

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");

希望能帮助到你

于 2013-05-16T14:02:55.537 回答
2

虽然 usingHasComponents.iterator()仍然是可能的com.vaadin.ui.AbstractComponentContainerimplements java.lang.Iterable<Component>,这使得迭代更加舒适:

  ...
  for ( Component c : layout ) {
    if ( id.equals( c.getId() ) ) {
      return c;
    }
  }
  ...  
于 2015-06-23T21:58:47.483 回答