2009-06-24 8 views
5

Um alle JTextfField s auf einem JPanel zu initialisieren, wenn Benutzer auf einen "Clear-Button" klicken, muss ich die JPanel durchlaufen (anstatt alle individuellen Feld zu "").Schleife durch JPanel

Wie kann ich eine For-Each-Schleife verwenden, um die JPanel auf der Suche nach JTextField s iterieren?

Antwort

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

Aber wenn Sie JTextFields tiefer verschachtelt haben, könnten Sie die folgende rekursive Form verwenden:

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: Eine Probe für Tom Hawtin - tackline Vorschlagsliste haben, wäre in Ihrer Frame-Klasse:

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

und wenn Sie den einzelnen Text initialisieren Felder, so dass sie zu dieser Liste hinzuzufügen:

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

und wenn der Benutzer auf die Löschtaste klickt, nur:

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

Löscht das auch Kombinationsfelder? (Könnte auch statisch sein, btw.) –

+0

JComboBox (erweitert JComponent) und JTextField (erweitert JTextComponent, die JComponent erweitert) sind auf zwei verschiedenen Pfaden – akarnokd

+0

Ich überprüfte die Quelle von JComboBox und ich sehe keinen Ort, wo JComboBox seinen Editor hinzufügt Komponente zu seiner Komponentenliste. – akarnokd

1

Während eine andere Antwort eine direkte Art und Weise zeigt Ihr Problem, Ihre Frage zu lösen, was impliziert, eine schlechte Lösung.

Im Allgemeinen wollen statische Abhängigkeiten zwischen den Schichten eine Möglichkeit sein. Sie sollten eine Packung durch getCommponents gehen müssen. Casting (Annahme von Generika) ist eine einfache Möglichkeit zu sehen, dass etwas schief gelaufen ist.

Wenn Sie also die Textfelder für ein Formular erstellen, fügen Sie sie zur Liste hinzu, die in einem Löschvorgang gelöscht werden soll, und fügen sie dem Bereich hinzu. Natürlich gibt es in echtem Code wahrscheinlich auch andere Dinge, die man mit ihnen machen möchte. In echtem Code möchten Sie wahrscheinlich mit Modellen (möglicherweise Document) statt JComponent s umgehen.

+0

+1 für die Idee, eine Liste von interessanten Komponenten zu haben – akarnokd

+0

Hallo, Vielen Dank. Das hört sich beeindruckend an, aber ich weiß nicht, wie ich Ihre Lösung implementieren soll. Die konkreten Beispiele sind 1000 Wörter wert. Sehr geschätzt. Dallag. –

+0

Und um es weiter voranzutreiben, habe ich mal eine Annotation-basierte Lösung zum Spaß ausprobiert. Ich habe meine Felder in der Klasse mit @SaveContent annotiert und eine reflektierende Methode zum Laden/Speichern von Inhalten der kommentierten Komponenten verwendet. – akarnokd