Schleife durch JPanel
-
10-07-2019 - |
Frage
Um alle JTextfField
s auf einem JPanel
zu initialisieren, wenn Benutzer auf einen „Löschtaste“, muss ich durch die JPanel
Schleife (statt alle einzelnen Bereich auf „“).
Wie kann ich ein for-Schleife, um jede durch die JPanel
auf der Suche nach JTextField
s iterieren?
Lösung
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 in Ihrer Rahmenklasse haben sei:
List<JTextField> fieldsToClear = new LinkedList<JTextField>();
und wenn Sie die einzelnen Textfelder initialisieren, fügen Sie sie in dieser Liste:
someField = new JTextField("Edit me");
{ fieldsToClear.add(someField); }
und wenn der Benutzer klickt auf die Schaltfläche Löschen, nur:
for (JTextField tf : fieldsToClear) {
tf.setText("");
}
Andere Tipps
Während eine andere Antwort eine direkte Art und Weise zeigt, Ihr Problem zu lösen, Ihre Frage ist eine schlechte Lösung impliziert.
wollen Allgemeinen statische Abhängigkeiten zwischen den Schichten ein Weg zu sein. Sie sollten eine Packung durch getCommponents
gehen müssen. Casting (vorausgesetzt, Generika) ist ein einfacher Weg, um zu sehen, dass etwas schief gegangen ist.
Also, wenn Sie die Textfelder für ein Formular erstellen, fügen Sie sie in die Liste in einem klaren Betrieb gelöscht werden sowie sie auf den Panel hinzufügen. Natürlich in echten Code gibt es wahrscheinlich andere Dinge, die Sie zu ihnen zu tun. In echten Code möchten Sie wahrscheinlich mit Modellen (möglicherweise Document
) statt JComponent
s zu tun haben.