2013-05-16 9 views
8

Pracuję nad projektem w Vaadin 7. W tym celu muszę przeanalizować wszystkie komponenty w layoucie i znaleźć komponent, którego potrzebuję.Vaadin - Iteracja komponentów w layoucie

enter image description here

Powyższe jest obrazowym przedstawieniem swojego układu.

Dynamicznie tworzę zielony układ pionowy w układzie pionowym w kolorze niebieskim. Ponieważ tworzę je dynamicznie, nie mogę mieć żadnej instancji dla tych dynamicznie tworzonych rzeczy. Ale mam unikalne identyfikatory dla wszystkich komponentów.

Teraz muszę znaleźć Combobox za pomocą Id. Nie wiem jak sparsować na combobox z kolorowego pionowego układu Blue.

Wszystko, co mam, to instancja w niebieskim układzie pionowym w kolorze niebieskim i identyfikator w polu combobox. I, jeśli to konieczne, mogę mieć identyfikatory do układów zielonych i czerwonych.

Muszę coś takiego, ale zatrzymany ..

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

byłby to pomysł, aby umieścić wszystkie składniki, które będzie wymagać później w hashset i używać ID jako klucza? –

Odpowiedz

11

Trzeba sprawdzić komponent rekurencyjnie.

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

Nadzieja pomaga

+0

Awesome man. To doskonale się łamie. – Gugan

0

Choć użyciu HasComponents.iterator() jest nadal możliwe com.vaadin.ui.AbstractComponentContainer realizuje java.lang.Iterable<Component>, co sprawia iteracji nieco bardziej komfortowe:

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