Java JFrame: como analisar de forma recursiva através de componentes (ou seja, se estiver usando JScrollPane)

StackOverflow https://stackoverflow.com/questions/368194

Pergunta

Eu estou usando TableLayout para meu swing GUI. Inicialmente apenas alguns rótulos básicos, botões e campos de texto quando necessário, que eu poderia, mais tarde, acesso por:

public Component getComponent(String componentName) {
    return getComponent(componentName, this.frame.getContentPane());
}

private Component getComponent(String componentName, Component component) {
    Component found = null;

    if (component.getName() != null && component.getName().equals(componentName)) {
        found = component;
    } else {
        for (Component child : ((Container) component).getComponents()) {
            found = getComponent(componentName, child);

            if (found != null)
                break;
        }
    }
    return found;
}

Infelizmente eu tive problemas depois de usar usando JScrollPane para apoiar rolagem em JTextArea e JTable do que eu fiz com:

JTextArea ta = new JTextArea();
ta.setName("fooburg");
JScrollPane scr = new JScrollPane(ta);
frame.getContentPane().add(scr, "1, 1");  // EDIT: changed, tkx bruno

Depois de sugestões, eu fui capaz de acesso através getComponent("fooburg") o componente desejado (a versão acima é o final). Muito obrigado a Dan e Bruno!

Foi útil?

Solução

@bruno é certo -. Você precisa adicionar o painel de texto para o painel de conteúdo do quadro

Um pouco OT: Se você geralmente deseja acessar todos os componentes em uma hierarquia, você precisa de algo recursiva - seu método atual só vai imprimir nomes filho imediato:

void printNames(Component component) {
    System.out.println(component.getName());
    for (Component child : component.getComponents()) {
        printNames(child);
    }
}

void printFrameNamesComponents(JFrame frame) {
    printNames(frame.getContentPane());
}

(não testado, mas algo como isto.)

Outras dicas

Você precisa adicionar a criança para o painel de conteúdo do JFrame em vez disso:

frame.getContentPane().add(comp);

Se você adicionar o seu novo componente de JFrame diretamente, o seu código acima nunca chegar da ele, porque você só está enumerando os componentes sob frame.getContentPane().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top