Criar um evento para uma classe personalizada

1 resposta
mateusviccari

Bom dia tenho uma classe que uso pra guardar um objeto:

public class GuardaObjeto(){
    
    private Object objeto;
    
    public GuardaObjeto(){}
    
    public void setObjeto(Object o){
        objeto=o;
    }

    public Object getObjeto(){
        return objeto;
    }    
}

Gostaria de poder adicionar um listener nas instancias dessa classe, por exemplo um addObjectChanged ou algo assim, que disparasse toda vez que entrasse nesse método setObjeto…
Tem como fazer?

1 Resposta

mateusviccari

Galera era bem mais facil do que eu imaginava, segue a solução aqui:
A classe GuardaObjeto fica assim:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package eventoPersonalizado;

import java.util.ArrayList;
import java.util.Collection;
import java.util.EventListener;
import java.util.EventObject;

/**
 *
 * @author Administrador
 */
public class GuardaObjeto {

    Object objeto;
    private Collection<GoListener> goListeners = new ArrayList<GoListener>();

    public GuardaObjeto() {
    }

    public Object getObjeto() {
        return objeto;
    }

    public void setObjeto(Object objeto) {
        this.objeto = objeto;
        disparaObjetoMudou();
    }

    public synchronized void addTelefoneListener(GoListener l) {
        if (!goListeners.contains(l)) {
            goListeners.add(l);
        }
    }

    private void disparaObjetoMudou() {
        Collection <GoListener> gl;  
  
        synchronized (this) {  
  
            gl = (Collection)(((ArrayList)goListeners).clone());  
  
        }  
  
        GoEvent evento = new GoEvent(this);                  
  
        for (GoListener g : gl) {  
  
            g.objetoMudou(evento);
  
        }  
    }
}

class GoEvent extends EventObject {

    public GoEvent(GuardaObjeto source) {
        super(source);
    }
    
}

interface GoListener extends EventListener{
    public void objetoMudou(GoEvent evt);
}

E pra usar é a mesma coisa que os eventos que ja estamos acostumados a trabalhar:

GuardaObjeto obj=new GuardaObjeto();
        obj.setObjeto("Olá!");
        obj.addTelefoneListener(new GoListener() {
            public void objetoMudou(GoEvent evt) {
                System.out.println("Objeto foi alterado! O novo objeto é: "+((GuardaObjeto)evt.getSource()).getObjeto().toString());
            }
        });
        obj.setObjeto("Mateus");
        obj.setObjeto(new Date());
        obj.setObjeto(Toolkit.getDefaultToolkit().getColorModel());

Pra quem quiser ta ai, mais facil do que isso impossivel!

Criado 16 de junho de 2012
Ultima resposta 17 de jun. de 2012
Respostas 1
Participantes 1