2013-05-16 8 views
8

Sto lavorando a un progetto in Vaadin 7. In questo ho bisogno di analizzare tutti i componenti in un layout e trovare un componente di cui ho bisogno.Vaadin - Iterate su componenti in un layout

enter image description here

Quanto sopra è la rappresentazione pittorica di mio layout.

Sto creando dinamicamente il layout verticale colorato in verde all'interno del layout verticale colorato in blu. Dal momento che li sto creando dinamicamente, non posso avere alcuna istanza per quelle cose create dinamicamente. Ma, ho ID univoco per tutti i componenti.

Ora ho bisogno di trovare un Combobox usando l'Id. Non riesco ad analizzare la casella combinata dal layout verticale colorato di blu.

Tutto ciò che ho è un'istanza del layout verticale di colore blu e di Id per la casella combinata. E, posso anche avere ID per i layout verde e rosso se necessario.

ho bisogno di qualcosa di simile, ma bloccato ..

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

Sarebbe un'idea di mettere tutti i componenti avremo bisogno in seguito di hashset e usare l'ID come chiave? –

risposta

11

Devi controllare componente in modo ricorsivo.

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

Speranza che aiuta

+0

Uomo fantastico. Funziona perfettamente. – Gugan

0

pur usando HasComponents.iterator() è ancora possibile com.vaadin.ui.AbstractComponentContainer implementa java.lang.Iterable<Component>, il che rende l'iterazione un po 'più a suo agio:

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