[RESOLVIDO] Adicionar listener a um JButton com Reflection

5 respostas
ERVER

Boa tarde, estou tentando add um listener em um JButton via reflexão, mas não consigo.

Estou fazendo da seguinte maneira: carrego a classe pelo nome, percorro seus campos (fields), até encontrar um JButton, ai crio uma nova instancia do JButton para add o listener nele. Não dá certo pelo fato da instância do JButton ser outra.

Segue o código:

package teste;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Field;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;

public class Teste {

    public  void testar() {
        String nomeDaClasse = "views.Janela";
        
        try {
            Class classe = Class.forName(nomeDaClasse);
                    
            for (Field campo : classe.getDeclaredFields()) {
                campo.setAccessible(true);
                try {
                     ((JButton)campo.getType().newInstance()).addActionListener(new ActionListener() {

                     @Override
                       public void actionPerformed(ActionEvent e) {
                           System.out.println("BOTÂO CLICADO!!!");
                        }
                     });

                } catch (        InstantiationException | IllegalAccessException ex) {
                    Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
                    System.out.println("ERRO");
                }
                
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Quem entender um pouco mais de reflection e puder dar uma luz, agradeço.

Abraços!

5 Respostas

ERVER

Ninguém?

Ataxexe

Você está apenas instanciando o JButton. Deveria fazer uma destas duas coisas:

1- Alterar o valor do Field (usando o método set)
2- Instanciar o JButton na própria classe e obter o valor do FIeld (usando o método get) para adicionar o listener

ERVER

Boa tarde Ataxexe,

Primeiramente muito obrigado por me ajudar!

O método get não espera um object? Então não estaria esperando uma instância?

Abraços.

Ataxexe

Exatamente! A instância seria uma instância de “nomeDaClasse”.

O seu maior problema é querer definir comportamento em uma instância sem ter a instância. Não tem como você adicionar um listener a um botão sem ter a instância do botão, e não tem como você ter a instância do botão sem ter a instância da classe (claro, sem consideramos coisas estáticas).

ERVER

Entendi!

Estou tentando fazer um pequeno framework para desenvolvimento com swing, mas acho que vou estudar um pouco mais a API de reflexão do Java.

Muito obrigado Ataxexe! Forte abraço!

Criado 27 de junho de 2014
Ultima resposta 1 de jul. de 2014
Respostas 5
Participantes 2