2009-05-13 8 views
5

Posso sapere come posso determinare se un componente è stato trovato in JPanel?Un modo rapido per determinare se un componente viene trovato in JPanel

boolean isThisComponentFoundInJPanel(Component c) 
{ 
    Component[] components = jPanel.getComponents(); 
    for (Component component : components) { 
     if (c== component) { 
       return true; 
     } 
    } 
    return false; 
} 

Utilizzando ciclo non è efficiente. C'è un modo migliore?

+0

No. è semplicemente basata sulla ragione tecnica 'false'. Per ottenere> la relazione genitore-figlio di 1 ° livello di profondità, ho usato la chiamata ricorsiva per raggiungere. All'epoca in cui ho letto Tom Hawtin, il mio primo pensiero è che getComponents restituirà> 1 ° livello di profondità ai bambini (il che non è vero). Quindi, ho pensato per la prima volta che fosse più semplice del tuo e questo mi fa scattare per accettarlo come risposta senza pensarci troppo. È un mio errore La risposta andrà alla tua :) –

risposta

11
if (c.getParent() == jPanel) 

Chiamare in modo ricorsivo se non si desidera relazioni parent-child immediate (che è probabilmente il caso in un pannello ben progettato).

... sebbene in un pannello ben progettato, è molto discutibile il motivo per cui è necessario sapere se un componente è contenuto nel pannello.

+1

+1 per "... anche se in un pannello ben progettato, è molto discutibile perché dovresti sapere se un componente è contenuto nel pannello." –

+0

Un pannello dinamico è un pannello mal progettato? – alphazero

+0

Non esiste una regola adatta a tutti. Usa il senso comune. Il pannello dinamico è buono e i miei utenti ne sono felici e il pannello dinamico deve scoprire genitore/figlio in modo dinamico durante l'esecuzione. Finché i miei utenti sono felici, non c'è nulla di discutibile quando ho bisogno di sapere se un componente è contenuto nel pannello. –

3

È improbabile che l'esecuzione di questa operazione sia un collo di bottiglia.

Guardare attraverso il contenuto di un contenitore probabilmente indica una cattiva progettazione. Dì alla GUI cosa fare, non interrogare il suo stato.

Probabilmente un modo migliore per scrivere il codice è utilizzare le routine esistenti. Sebbene ci sia un sovraccarico, è più probabile che siano già compilati (quindi possibilmente più veloci) e meno codice.

boolean isComponentInPanel(Component component) { 
    return 
     java.util.Arrays.asList(panel.getComponents()) 
      .contains(component); 
} 

(o rispondere utilizzo kdgregory.)

4

è possibile utilizzare

jPanel.isAncestorOf(component) 

per la ricerca ricorsiva

Problemi correlati