Como limpar todos os JTextFields em Java

Pessoal estou tentando limpar todos os campos de texto do JFrame, e o método que estou usando até funciona, mas se preciso colocar alguns campos dentro de um JPane os campos que ficam dentro desse painel, não são apagados, só os de fora, acho que é pq o método que estou usando considera o painel como um componente do JFrame e por isso não percorre os componentes de dentro dele, alguém pode me ajudar a limpar todos os campos de texto, mesmo estando dentro de outros componentes?
public void limpaCampos(){
//Limpando todos os campos
for (int i = 0; i < getContentPane().getComponentCount(); i++) {
Component c = getContentPane().getComponent(i);
if (c instanceof JTextField) {
JTextField campoASerApagado = (JTextField) c;
campoASerApagado.setText(null);
}
}
}

É só usar recursividade:

public void limpaCampos() {
    limpaCampos(getContentPane());
}

private void limpaCampos(Container container) {
    for (Component c : container.getComponents()) {
        if (c instanceof Container) {
            limpaCampos((Container) c);
        } else if (c instanceof JTextComponent) {
            ((JTextComponent) c).setText(""); // vazio não é null
        }
    }
}

staroski, obrigado por responder, mas ainda não consegui fazer funcionar, eu coloquei um System.out.println(), dentro de cada if pra ver se entrava no if do JTextField e ele só printa o
System.out.println(“container”), então quer dizer que ele não está pegando os textfields e agora ele nem apaga mais os campos dentro dos panes nem os que estão fora deles

public void limpaCampos() {
limpaCampos(getContentPane());
}

private void limpaCampos(Container container) {
    for (Component c : container.getComponents()) {
        if (c instanceof Container) {
            limpaCampos((Container) c);
            System.out.println("container");
        } else if (c instanceof JTextField) {
            System.out.println("textfield");
            JTextField campoASerApagado = (JTextField) c;
            campoASerApagado.setText(null);
        }
    }
}

Eu não sei se fiz algo de errado e por isso não funcionou

1 curtida

Falha minha, esqueci que os JTextComponents estendem Container.

É só inverter a ordem dos ifs:

private void limpaCampos(Container container) {
    for (Component c : container.getComponents()) {
        if (c instanceof JTextComponent) {
            ((JTextComponent) c).setText(""); // vazio não é null
        } else if (c instanceof Container) {
            limpaCampos((Container) c);
        } 
    }
}

Eu prefiro usar setText("") ao invés de null.
Evita a chance de acontecer NullPointerException quando alguém quiser manipular o conteúdo do campo.

1 curtida

staroski, agora deu certo, muito obrigado mesmo, eu tava quebrando a cabeça e não estava dando certo de nenhum dos jeitos que eu tentei, vlw amigo =)

E obrigado pela dica de substituir o null pelo (""), vou usar tbm.

1 curtida