2013-05-16 5 views
8

Ich arbeite an einem Projekt in Vaadin 7. Darin muss ich alle Komponenten in einem Layout analysieren und eine Komponente finden, die ich brauche.Vaadin - Iterate über Komponenten in einem Layout

enter image description here

Die oben ist die bildliche Darstellung meines Layout.

Ich erstelle dynamisch das grün gefärbte vertikale Layout im blau gefärbten vertikalen Layout. Da ich sie dynamisch erstelle, kann ich keine Instanz für diese dynamisch erzeugten Dinge haben. Aber ich habe eindeutige IDs für alle Komponenten.

Jetzt muss ich eine Combobox mit der ID finden. Ich kann nicht aus dem blauen vertikalen Layout in die Combobox einlesen.

Alles, was ich habe, ist eine Instanz des blauen vertikalen Layouts und IDs für Combobox. Und ich kann IDs für grüne und rote Layouts auch wenn nötig haben.

Ich brauche so etwas, aber stecken ..

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

Wäre es eine Idee sein, Sie alle Komponenten zu setzen Wird später im hashset benötigt und die ID als Schlüssel verwenden? –

Antwort

11

Sie haben Komponente rekursiv zu überprüfen.

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

Hoffe, dass es

+0

Awesome Mann. Es funktioniert perfekt. – Gugan

0

Obwohl HasComponents.iterator() verwendet, ist com.vaadin.ui.AbstractComponentContainer implementiert java.lang.Iterable<Component> noch möglich hilft, die die Iteration etwas bequemer macht:

... 
    for (Component c : layout) { 
    if (id.equals(c.getId())) { 
     return c; 
    } 
    } 
    ...