Como acessar todos components de um JFrame?

E ai bravos guerreiros da TERRA MÉDIA blz , :smiley:

não sei se isso e BASICO ou AVANÇADO, pois a rotina interia e AVANÇADA mais acho que a duvida que estou dentro dela e BASICA vamos lá !!!

To com um probleminha eu to fazendo um mini Framework, estou fazendo uma rotina que recebe um JFrame,JInternalFrame,JDialog e percorre todos seus componentes e de acordo com seus nomes grava os no respectivo campo no SGBD bom tenho toda logica na cabeça do acesso recursivo e tudo mais tem algo de errado, umas perguntas se eu percorrer o JFrame se este possuir um JPanel irei tb Percorrer os controles dentro dele ? olhem a rotina abaixo e me digam oque esta errado :? ou me deem uma ideia de como fazer, ela e somente um teste.

    public void postFrame(javax.swing.JInternalFrame frm) {
        java.awt.Component[] cpcount = frm.getComponents();
        java.awt.Component[] cpjcount;
        
        for(int i=0;i<cpcount.length;i++) {
            if(cpcount[i] instanceof javax.swing.JPanel) {
                cpjcount= ((javax.swing.JPanel)cpcount[i]).getComponents();
                for(int j=0;j<cpjcount.length;j++) {
                    if(cpjcount[j] instanceof javax.swing.JTextField) {
                        System.out.println(((javax.swing.JTextField)cpjcount[j]).getText());
                    }
                    
                }
            }
        }
    }

A questão e que não esta imprimindo o conteudo dos JTextField !!! PQ ?

falow !!!

anjomal, se eu entendi o que vc está querendo fazer, acho que você deveria verificar não se o elemento do array é um JPanel, mas se é um Container.

Além disso, escreva esse método de tal modo que você possa fazer chamadas dele para ele mesmo, recursivamente (como você disse que já pensa em fazer).

No mais, achei estranho você pegar o getText() para o JTextField. Imagine os outros componentes! Acho que você deveria armazenar o resultado de toString().

Qq vc acha? (ou nada a ver?) :roll:

e ai Dango, o seguinte como eu te falei essa rotina e so para teste eu fiz uma chamada a System.out.println() com o metodo getText so para ver se a minha rotina estava percorrendo todos componentes do Frame, mais acho que chamar a rotina novamente ? entrarei em loop infinito !? não,pq eu tenho de seguir a hierarquia do Fame, se eu chamar novamente a rotina como vou saber onde parei ? da até pra fazer mais ai teria de percorrer todos os componentes de novo :shock: , xiii eu fiquei meio bolado com o getComponet pois ele so me retorna os componetes do conteiner pai ? como resolveremos isso ?

falow t+

Hehe, não entra em loop infinito! Métodos recursivos realmente requerem um meio de encerrar as chamadas em um determinado ponto. Considerando que você está em um laço for, quando a iteração atingir o seu limite o seu método começará a retornar, da chamada mais recente para chamada mais antiga (como em uma pilha de pratos – isso é conhecido como LIFO, ou seja Last In First Out, o último entrar é o primeiro a sair).

Para tornar o seu teste mais realista, acho que você deveria fazer as alterações que sugeri: verificar instanceof java.awt.Container ao invés de instanceof javax.swing.JPanel e fazer com que seu método receba como argumento um objeto java.awt.Container (assim poderá passar JInternalFrames, JFrames, JPanels, … tudo o que estender de java.awt.Container).

Dentro do laço for mais externo, quando vc testar que o componente é um Container, então você chama o seu método (o mesmo) novamente passando o Container do elemento da matriz como argumento.

Agora já estou indo embora.
Em casa vou tentar escrever um exemplo disso e amanhã posto o resultado aqui no fórum.

Espero ter esclarecido algo.

Rapaz e verdade LIFO e FIFO mais não saibia como o JAVA iria agir dentro das chamadas recursivas então perguntei se iria entrer em loop :frowning: , to vendo se resolvo o rpoblema aqui se resolver vou postar aqui o Mini-Framework… mais mesmo assim se fizer algo poste aqui.

falow quelão !!! :smiley:

anjomal, conforme tinha prometido, eu fiz os testes. Escrevi dois programas que você pode consultar nos seguintes links:

http://www.engineweb.com.br/java/tcontainer1.html e
http://www.engineweb.com.br/java/tcontainer2.html

O primeiro, nas linhas de 56 a 72, você encontrará o método reportContainer(). Esse método recebe um Container e percorre todos os componentes existentes nele; para cada componente que for uma instância de java.awt.Container ele chama a si mesmo passando esse componente como argumento, e assim por diante.

Repare no resultado (impresso na janela do console) que ele tenta procurar por componentes dentro do JButton! Isso ocorre por que o JButton está na hierarquia java.awt.Container (já que todo javax.swing.JComponent está na hierarquia de java.awt.Container).

O segundo teste, tenta resolver esse problema criando uma classe que estende JButton. Assim o trecho de código do segundo exemplo, que vai da linha 65 a 72, evita que o código entre naquele componente.

Achei a solução um pouco tosca. Talvez uma interface fosse uma solução mais genérica para aqueles componentes que você não quer que o algorítimo “entre”.

Espero ter ajudado.
Abraços.

Ops blz dango, ai hoje eu não mexi no Framework pois estava desenvolvendo uma classe de PlainDocument, mais será que não tem jeito de procurar por objetos especializados abaixo da hieraquia do Conteiner ? Desculpe se falei besteira ? pq eu to querendo fazer o negocio ficar bem facil para o Desenvolvedor tipo ele chama o metodo postFields(JFrame,Internal …) e ele sai varrendo atras de JTextField e etc … tem como ?

falow
t+

Hmmm. Eu estava já escrevendo a resposta quando vi uma “parede”. Num sei não, mas deve dar pra fazer isso sim…; tem q pensar um pouco… :roll: