Obter todos os Componentes de um Container

7 respostas
adriano_si

O único tópico que achei sobre isto está aqui e não foi resolvido… rsrsrsrsrs

http://www.guj.com.br/posts/list/92761.java#496634

Portanto gostaria da ajuda de vocês em uma solução de problema… Quero em meu JInternalFrame trazer todos os Componentes e verificá-los para saber se o mesmo é um JTextField ou JPasswordField (depois irei expandir para os demais componentes de texto) para poder desabilitá-los, sendo que nem sempre saberei quais campos terei na tela. Consegui fazer uma comparação pelo setName() do componente, porém eu acho que o método está me retornando os containers JPanels que estão dentro do meu JIF.

Aí está o código do que estou sonhando em fazer…

private void limpaCampos(JInternalFrame jiFrame) {
    Component componentTeste[] = jiFrame.getComponents(); 
    String nomeTeste = "";
    for(Component compLoop : componentTeste) {
        nomeTeste = compLoop.getName(); // Somente pra ver se está trazendo o nome...
        System.out.println(nomeTeste);
        if(nomeTeste.substring(0, 1).equals("tf") || nomeTeste.substring(0, 1).equals("pf")) {
            compLoop.setEnabled(false);
        }
    }

Pois bem… está retornando [null null]

Minha hierarquia de componentes está assim:

  • JScroolBar
    • JTable
  • JPanel
    • JButtons CRUD
  • JPanel
    • JTextFields e JPasswordFields que são meus campos
    • JPanel
      • JButtons - Cancelar e Salvar

Acho que o getComponents() está me retornando um Array só com os dois Panels… Será ???

Falows :wink:

7 Respostas

adriano_si

ERRATA: o comentário acima é na linha do System.out.println()

F

adriano_si:
O único tópico que achei sobre isto está aqui e não foi resolvido… rsrsrsrsrs

http://www.guj.com.br/posts/list/92761.java#496634

Portanto gostaria da ajuda de vocês em uma solução de problema… Quero em meu JInternalFrame trazer todos os Componentes e verificá-los para saber se o mesmo é um JTextField ou JPasswordField (depois irei expandir para os demais componentes de texto) para poder desabilitá-los, sendo que nem sempre saberei quais campos terei na tela. Consegui fazer uma comparação pelo setName() do componente, porém eu acho que o método está me retornando os containers JPanels que estão dentro do meu JIF.

Aí está o código do que estou sonhando em fazer…

private void limpaCampos(JInternalFrame jiFrame) {
    Component componentTeste[] = jiFrame.getComponents(); 
    String nomeTeste = "";
    for(Component compLoop : componentTeste) {
        nomeTeste = compLoop.getName(); // Somente pra ver se está trazendo o nome...
        System.out.println(nomeTeste);
        if(nomeTeste.substring(0, 1).equals("tf") || nomeTeste.substring(0, 1).equals("pf")) {
            compLoop.setEnabled(false);
        }
    }

Pois bem… está retornando [null null]

Minha hierarquia de componentes está assim:

  • JScroolBar
    • JTable
  • JPanel
    • JButtons CRUD
  • JPanel
    • JTextFields e JPasswordFields que são meus campos
    • JPanel
      • JButtons - Cancelar e Salvar

Acho que o getComponents() está me retornando um Array só com os dois Panels… Será ???

Falows ;)

meu primeiro post no guj XD

cara talvez nao tenha nada a ver mais seu "nomeTeste.substring(0, 1).equals(“pf”)) " nunca vai ser true pq a sbustring de 0,1 soh retorna 1 caracter se tu queres os 2 priemiros carcteres terias que usar .substring(0,2)

adriano_si

Pensei que o segundo parametro do método fosse pra controlar até qual caractere que a String teria qu retornar…

Porém não é esse o erro não… tá dando um NullPointerException aquiif(nomeTeste.substring(0, 1).equals("tf") || nomeTeste.substring(0, 1).equals("pf"))

Mas valew… vou continuar tentando… 8)

T
nomeTeste = compLoop.getName()

Isso só funciona se você, ao criar o componente, atribuiu-lhe um nome com “setName” (veja seu método “initComponents” ou outro que cria os componentes. Como você provavelmente não chamou “setName” isso nunca vai funcionar.
Em vez disso, é melhor ver se a classe do componente é JTextField ou JPasswordField. Nesse caso, você tem de usar “instanceof”.
Como um JPasswordField extends JTextField, então você primeiramente testa se “compLoop instanceof JPasswordField”, e depois testa se “compLoop instanceof JTextField”. OK?

Conselho: não dependa demais de nomes e strings. Obter o nome de um objeto em tempo de execução, achando que é o mesmo nome da variável, não funciona. Nem é muito legal usar “reflection” nesse caso (muita gente nem pensa e já vai logo recomendando reflection, como se fosse um remédio para todos os males). Nesse seu caso um “instanceof” já resolve, e muito bem.

adriano_si

Valeu thingol… na verdade o setName eu usei sim… uso o NetBeans e setei o name dos componentes… mas era justamente o instanceof que eu estava atrás… Só preciso lembrar da sintaxe… mas valeu cara… porém ainda tenho certeza que o getComponents() está retornando os JPanels que adicionei… pois no teste no System.out.println() ele está me retornando null null

Falows :wink:

adriano_si

Só mais uma pergunta… o instanceof não vai comparar um Component a um JTextField ?? logo não será sempre false ??

Valews :wink:

adriano_si

É isso mesmo… fiz esse teste e comprovei…

private void limpaCampos(JInternalFrame jiFrame) { Component componentTeste[] = jiFrame.getComponents(); for(int i = 0; i < componentTeste.length; i++) { Class c = componentTeste.getClass(); JOptionPane.showMessageDialog(null, c); if(componentTeste[i] instanceof JTextField) { JOptionPane.showMessageDialog(null, "Aqui"); componentTeste[i].setEnabled(false); } } }

Caraca… agora é que foi… como faço isso ??? hehehehehe

Valew galera… :stuck_out_tongue:

Criado 1 de outubro de 2008
Ultima resposta 1 de out. de 2008
Respostas 7
Participantes 3