DocumentListener Genérico

4 respostas
matheusssilva

Bem gente, to querendo criar um DocumentListner Genérico, e passar por parametro o método que ele deve invocar

private class ListnerAlteracoes implements DocumentListener{

        public void insertUpdate(DocumentEvent e) {
            metodo();
        }

        public void removeUpdate(DocumentEvent e) {
            metodo();
        }

        public void changedUpdate(DocumentEvent e) {
            metodo();
        }
    }

O método ‘metodo’ deve ser passado por parametro. Sei que isso pode ser feito com reflections mas ainda não sou familiarizado com reflections.
Outro detalhe é que o parametro deve ser apenas o método e não toda a classe, pois o metodo encontra-se dentro da classe de um internalframe de cadastros sendo assim ta chio de métodos publicos e privados lá dentro. Acredito que passa somente o método em questão ficará mais simples.

Valeu

4 Respostas

ViniGodoy

Passe uma interface.

public interface DocumentAction {
   void metodo();
}
private class ListnerAlteracoes implements DocumentListener{
        public DocumentAction action;

        public ListnerAlteracoes(DocumentAction action) { this.action = action; }

        public void insertUpdate(DocumentEvent e) {
            action.metodo();
        }

        public void removeUpdate(DocumentEvent e) {
            action.metodo();
        }

        public void changedUpdate(DocumentEvent e) {
            action.metodo();
        }
    }

É muito mais simples que fazer com reflection, e ainda tem verificações tem compile time. Outra alternativa é fazer um DocumentListener abstrato, com um método a ser implementado:

private class AbstractDocumentListenerAlteracoes implements DocumentListener{

        public void insertUpdate(DocumentEvent e) {
            metodo();
        }

        public void removeUpdate(DocumentEvent e) {
            metodo();
        }

        public void changedUpdate(DocumentEvent e) {
            metodo();
        }

        public abstract void metodo();
    }

E então fazer filhos dele. Mas eu ainda prefiro a primeira alternativa.

matheusssilva

Primeira opção, deixa eu vê se eu entendi.

1º Eu vou criar uma interface com um método a ser implementado

2º Implemento essa interface na classe de cadastro e defino o corpo do método

3º Depois passo essa interface como parametro para a classe ListnerAlteracoes

public class ClassedeCadastro implements DocumentAction {

   public void metodo(){
      // corpo do método
   }

   textfield.getDocument.addDocumentListener(new ListnerAlteracoes( // O QUE EU PASSO AQUI?));
}
private class ListnerAlteracoes implements DocumentListener{
        public DocumentAction action;

        public ListnerAlteracoes(DocumentAction action) { this.action = action; }

        public void insertUpdate(DocumentEvent e) {
            action.metodo();
        }

        public void removeUpdate(DocumentEvent e) {
            action.metodo();
        }

        public void changedUpdate(DocumentEvent e) {
            action.metodo();
        }
    }
ViniGodoy
public class ClassedeCadastro implements DocumentAction {  

   public void metodo(){  
       // corpo do método  
   }  

   textfield.getDocument.addDocumentListener(new ListnerAlteracoes(this));  
}

Ou:

public class ClassedeCadastro implements DocumentAction {  

...

   textfield.getDocument.addDocumentListener(new ListnerAlteracoes(new DocumentAction() {
       public void metodo() {
           //corpo do método
       }));  
}
matheusssilva

Perfeito grande Vini.

Abraço!

Criado 27 de julho de 2010
Ultima resposta 27 de jul. de 2010
Respostas 4
Participantes 2