2009-06-24 19 views
5

Per inizializzare tutti gli JTextfField s su un JPanel quando gli utenti fanno clic su un "pulsante di cancellazione", ho bisogno di eseguire il ciclo attraverso lo JPanel (invece di impostare tutti i singoli campi su "").loop through JPanel

Come posso utilizzare un ciclo for-each per iterare attraverso lo JPanel alla ricerca di JTextField s?

risposta

15
for (Component c : pane.getComponents()) { 
    if (c instanceof JTextField) { 
     ((JTextField)c).setText(""); 
    } 
} 

Ma se avete JTextFields più profondamente nidificate, è possibile utilizzare il seguente modulo ricorsiva:

void clearTextFields(Container container) { 
    for (Component c : container.getComponents()) { 
     if (c instanceof JTextField) { 
      ((JTextField)c).setText(""); 
     } else 
     if (c instanceof Container) { 
      clearTextFields((Container)c); 
     } 
    } 
} 

Edit: un campione per Tom Hawtin - tackline suggerimento sarebbe quello di avere la lista nella classe frame:

List<JTextField> fieldsToClear = new LinkedList<JTextField>(); 

e quando si inizializza il singolo testo campi, aggiungerli a questa lista:

someField = new JTextField("Edit me"); 
{ fieldsToClear.add(someField); } 

e quando l'utente fa clic sul pulsante Cancella, basta:

for (JTextField tf : fieldsToClear) { 
    tf.setText(""); 
} 
+0

Chiavi anche le caselle combinate? (Potrebbe anche essere statico, btw.) –

+0

JComboBox (estende JComponent) e JTextField (estende JTextComponent che estende JComponent) sono su due percorsi diversi – akarnokd

+0

Ho controllato l'origine di JComboBox e non vedo alcun posto dove JComboBox aggiunge il suo editor componente alla sua lista di componenti. – akarnokd

1

Mentre un'altra risposta mostra un modo diretto per risolvere il tuo problema, la tua domanda sta implicando una soluzione scadente.

Generalmente, le dipendenze statiche tra i livelli devono essere unidirezionali. Dovresti andare a fare un pacco attraverso getCommponents. Il casting (assumendo i generici) è un modo semplice per vedere che qualcosa è andato storto.

Così, quando si creano i campi di testo per un modulo, aggiungerli all'elenco da cancellare in un'operazione chiara e aggiungerli al pannello. Ovviamente nel codice reale ci sono probabilmente altre cose che vuoi fare anche a loro. Nel codice reale probabilmente vorrai avere a che fare con i modelli (forse Document) anziché con lo JComponent s.

+0

+1 per l'idea di avere la lista dei componenti interrelati – akarnokd

+0

Ciao, Grazie mille. Sembra impressionante ma non saprei come implementare la tua soluzione. Gli esempi concreti valgono 1000 parole. Molto apprezzato. Dallag. –

+0

E per spingermi oltre, una volta ho provato una soluzione basata su annotazioni per divertimento. Ho annotato i miei campi nella classe con il mio @ SaveContent e ho usato un approccio riflessivo per caricare/salvare il contenuto dei componenti annotati. – akarnokd