Desenhando telas dinamicamente apartir de um XML

7 respostas
paulork

Olá pessoal, estou com problemas. Estou trabalhando um montador de telas apartir de sua descrição em formato XML. Apartir desse XML ele irá montar a tela (JFrame) e todo os outros componentes presentes na mesma, inclusive tabelas e eventos em botões…

o problema está justamente aí… como adicionar esses eventos aos botões dinamicamente. Para melhor entendimento de todos segue abaixo o XML para montagem da tela, o método que cria os botões, um MouseListener e um ESBOÇO de como a função que vai adicionar o evento ao botão poderia (ou deveria) ficar.

Arquivo XML:

<TForm id="frmPrincipal" label="Teste XML - Form Dinâmico" pai="">
	<TEdit id="edtNome" label="Nome do usuario:"  default="João da Silva"/>
	<TEdit id="edtEnd" label="Endereço:" default="Rua XXXXXXXXX"/>
	<TButton id="btnFecha" label="Fechar">
		<Evento tipo="CLICK" action="close"/>
	</TButton>
</TForm>

Método que cria os botões:

// Cria um JButton setando seus atributos
    public JButton criaButton(String id, String label, int largura, int altura, int pos_x, int pos_y) {  
        JButton button = new JButton(label);  
        button.setName(id);
        button.setHorizontalAlignment(0);
        button.setBounds(pos_x, pos_y, largura, altura); 
        return button;  
    }

MouseListener (evento para fechar a tela):

MouseListener close = new MouseAdapter() {     
         public void onMouseClicked(MouseEvent evt) {     
              System.exit(0);
         }     
    };

dessa forma se vincula o evento ao botão:

btn.addMouseListener(evento);

mas gostaria de algo tipo assim, para poder setar o evento ao botão:

public void eventoBTN(JButton btn, MouseListener evento){
        btn.addMouseListener(evento);
    }

será que alguem pode me ajudar?

agradeço a atenção

7 Respostas

fuadksd

não entendi mto bem: vc quer salvar seu listener em xml? é isso?

E

Ele quer especificar o nome do listener em um XML.

fuadksd

acho que isso depende de como voce faz a leitura do seu xml. tu ta desserializando ele inteiro? o objeto?

E

Por exemplo, ele poderia indicar, no XML, qual é o nome da classe que implementa a interface MouseListener. Então ele pode obter essa classe por reflection.

Um exemplo:

No seu caso, você tem de instanciar (ou obter uma instância da classe, sei lá o que é melhor no seu caso" br.com.exemplo.MeuMouseListener", atribuir a uma variável do tipo MouseListener, e chamar o método “mouseClicked”.

Obviamente isso é meio chato de configurar, portanto você pode abreviar isso para

paulork

Pois eh, aí está o problema… Como fazer isso da melhor maneira possivel?

<TButton id="btnFecha" label="Fechar">
      <Evento tipo="CLICK" action="close"/>
</TButton>

no trecho acima tenho um TIPO (CLICK) que me indica que é um evento de clique do mouse e na ACTION um “close” que indica que a ação será de fechamento… esse é o padrão do XML que recebo…
mas, por exemplo, eu poderia ter mais um button com evento associado, e esse evento poderia ser outro:

<TButton id="btnFecha" label="Fechar">
      <Evento tipo="CLICK" action="qualquer outra ação aqui"/>
</TButton>

o detalhe eh que eu queria algo melhor do que declarar classes “estáticas” no código e fazer um monte de IFs para o caso do tipo ser CLICK, INIT, KEY, etc; e para o caso da action ser CLOSE, chamada a WS, abrir form ou qualquer outra coisa…
isso parece muito estruturada para o meu gosto… nada contra, mas tem que ter um jeito melhor…
Não tem como gerar uma classe tipo “Eventos.getEvento(tipo, action)” para qual eu passaria o TIPO e a ACTION e ela me retornaria o evento

preciso de alguma ideia de como poder fazer isso… como vocês fariam?

paulork

ninguem?

E

Que tal dar uma olhadinha nos fontes do SwiXML?

http://www.swixml.org/

Criado 23 de abril de 2012
Ultima resposta 7 de mai. de 2012
Respostas 7
Participantes 3