2012-12-05 16 views
5

C'è un modo per generare automaticamente ID su SWT-Widget in modo che i test dell'interfaccia utente possano farvi riferimento? So che posso impostare manualmente un id utilizzando seData, ma voglio implementare questa funzionalità per un'applicazione esistente in un modo un po 'generico.Genera automaticamente ID su SWT-Widget

risposta

8

È possibile assegnare in modo ricorsivo ID per tutte le shell dell'applicazione utilizzando Display.getCurrent().getShells(); e Widget.setData();.

Impostazione della ID

Shell []shells = Display.getCurrent().getShells(); 

for(Shell obj : shells) { 
    setIds(obj); 
} 

Si ha accesso a tutte le conchiglie (non cedute) attivi nella propria applicazione con il metodo Display.getCurrent().getShells();. È possibile eseguire il ciclo di tutti i figli di ogni Shell e assegnare un ID a ciascun Control con il metodo Widget.setData();.

private Integer count = 0; 

private void setIds(Composite c) { 
    Control[] children = c.getChildren(); 
    for(int j = 0 ; j < children.length; j++) { 
     if(children[j] instanceof Composite) { 
      setIds((Composite) children[j]); 
     } else { 
      children[j].setData(count); 
      System.out.println(children[j].toString()); 
      System.out.println(" '-> ID: " + children[j].getData()); 
      ++count; 
     } 
    } 
} 

Se il Control è un Composite può avere i controlli all'interno del composito, che è il motivo per cui ho usato una soluzione ricorsiva nel mio esempio.


Individuazione controlli per ID

Ora, se vi piace di trovare un controllo in uno dei tuoi conchiglie Vorrei suggerire una simile, ricorsivo, approccio:

public Control findControlById(Integer id) { 
    Shell[] shells = Display.getCurrent().getShells(); 

    for(Shell e : shells) { 
     Control foundControl = findControl(e, id); 
     if(foundControl != null) { 
      return foundControl; 
     } 
    } 
    return null; 
} 

private Control findControl(Composite c, Integer id) { 
    Control[] children = c.getChildren(); 
    for(Control e : children) { 
     if(e instanceof Composite) { 
      Control found = findControl((Composite) e, id); 
      if(found != null) { 
       return found; 
      } 
     } else { 
      int value = id.intValue(); 
      int objValue = ((Integer)e.getData()).intValue(); 

      if(value == objValue) 
       return e; 
     } 
    } 
    return null; 
} 

Con il metodo findControlById() si può facilmente trovare un Control dal suo ID.

Control foundControl = findControlById(12); 
    System.out.println(foundControl.toString()); 

Link

Problemi correlati