Search code examples
javaswingloopsjpaneljtextfield

loop through JPanel


In order to initialize all JTextfFields on a JPanel when users click a "clear button", I need to loop through the JPanel (instead of setting all individual field to "").

How can I use a for-each loop in order to iterate through the JPanel in search of JTextFields?


Solution

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

    But if you have JTextFields more deeply nested, you could use the following recursive form:

    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: A sample for Tom Hawtin - tackline suggestion would be to have list in your frame class:

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

    and when you initialize the individual text fields, add them to this list:

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

    and when the user clicks on the clear button, just:

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