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?
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. */packageeventoPersonalizado;importjava.util.ArrayList;importjava.util.Collection;importjava.util.EventListener;importjava.util.EventObject;/** * * @author Administrador */publicclassGuardaObjeto{Objectobjeto;privateCollection<GoListener>goListeners=newArrayList<GoListener>();publicGuardaObjeto(){}publicObjectgetObjeto(){returnobjeto;}publicvoidsetObjeto(Objectobjeto){this.objeto=objeto;disparaObjetoMudou();}publicsynchronizedvoidaddTelefoneListener(GoListenerl){if(!goListeners.contains(l)){goListeners.add(l);}}privatevoiddisparaObjetoMudou(){Collection<GoListener>gl;synchronized(this){gl=(Collection)(((ArrayList)goListeners).clone());}GoEventevento=newGoEvent(this);for(GoListenerg:gl){g.objetoMudou(evento);}}}classGoEventextendsEventObject{publicGoEvent(GuardaObjetosource){super(source);}}interfaceGoListenerextendsEventListener{publicvoidobjetoMudou(GoEventevt);}
E pra usar é a mesma coisa que os eventos que ja estamos acostumados a trabalhar:
GuardaObjetoobj=newGuardaObjeto();obj.setObjeto("Olá!");obj.addTelefoneListener(newGoListener(){publicvoidobjetoMudou(GoEventevt){System.out.println("Objeto foi alterado! O novo objeto é: "+((GuardaObjeto)evt.getSource()).getObjeto().toString());}});obj.setObjeto("Mateus");obj.setObjeto(newDate());obj.setObjeto(Toolkit.getDefaultToolkit().getColorModel());
Pra quem quiser ta ai, mais facil do que isso impossivel!