Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Duda Eventos JavaBeans

Hola a tod@s,
me estoy volviendo loco con un sencillo ejemplo de JavaBeans...
Os comento...estoy intentado añadir eventos propios a un Bean creado por mi...super sencillo...sin interfaz gráfica ni nada...que cuando cambia el valor de la temperatura aviso a todos los escuchadores etc etc.
El problema lo tengo al utilizar este bean fuera del proyecto...En el jar cuando lo importo...se ven claramente todas las clases (Temperatura, TemperaturaChangedEvent, TemperaturaChangedListener, TemperaturaBeanInfo), pero cuando quiero crear un objeto anónimo de TemperaturaChangedListener no me aparece dicha clase, todas menos esa.
Me he dado cuenta que en el BeanInfo, en la parte de EventSources está el Listener tempChangedListener, pero está en rojo, y no me da la opción de darle a TOggle Include.
No sé qué hacer...ayudaaaaa!
Saludos.

agosto 27, 2013 | Unregistered Commentershao

No somos adivinos.
Si no planteas con detalle, y con código, el problema que tienes, cierro este hilo.

agosto 27, 2013 | Registered Commenterchoces

Ok ahí va:
Clase TPAviso

public class TPAviso extends JButton implements ActionListener, Serializable {
int periodoSegs;
String mensaje;
Timer t;
LinkedList listeners;
public TPAviso() {
periodoSegs = 60;
t = new Timer(1000 * periodoSegs, this);
listeners = new LinkedList();
}
public TPAviso(String aMensaje, int aPeriodoSegs) {
periodoSegs = aPeriodoSegs;
mensaje = aMensaje;
t = new Timer(1000 * periodoSegs, this);
listeners = new LinkedList();
}
public void addEventoAvisoListener(EventoAvisoListener l) {
listeners.add(l);
}
public void removeEventoAvisoListener(EventoAvisoListener l) {
listeners.remove(l);
}
private void fireEventoAviso(EventoAviso ea)
{
EventoAvisoListener eal;
iterator i = listeners.listIterator(0);
while (i.hasNext()) {
eal = (EventAvisoListener) i.next();
eal.procesarAviso(ea);
}
}
public void actionPerformed(ActionEvent e) {
fireEventoAviso(new EventoAviso(this));
JOptionPane.showMessageDialog(null, mensaje, "Aviso",
JOptionPane.INFORMATION_MESSAGE);
setActiva(false);
}
public void setActiva(boolean valor) {
if (valor == true)
t.start();
else
t.stop();
}
public boolean getActiva() {
return t.isRunning();
}
public void setMensaje(String aMensaje) {
mensaje = aMensaje;
}
public String getMensaje() {
return mensaje;
}
public void setPeriodoSegs(int aPeriodoSegs) {
periodoSegs = aPeriodoSegs;
t.setInitialDelay(1000 * periodoSegs);
if (t.isRunning()) {
t.restart();
}
}
public int getPeriodoSegs() {
return periodoSegs;
}
}

Clase EventoAviso:

class EventoAviso extends java.util.EventObject {
EventoAviso(Object s) {
super(s);
}
}

Y la interfaz EventoAvisoListener :

interface EventoAvisoListener extends java.util.EventListener {
public void procesarAviso(EventoAviso ev);
}


Esto es el bean.

Ahora fuera del main, creo un frame, añado este bean y para añadirle el listener hago lo siguiente:

public PruebaFrameEventosBeans() {
initComponents();
this.pruebaEventosBeans1.addEventoAvisoListener(new EventoAvisoListener(){

@Override
public void procesaEvento(EventoAviso e) {
System.out.println("Holaaaaa");
}
});
}

Tengo otro ejemplo que tampoco me funciona..pero me gustaría arreglar este y con este ya arreglo el otro yo solo.
Gracias.

agosto 27, 2013 | Unregistered Commentershao

Correción de lo de antes...que no puedo editarlo...
donde pone fuera del main...es fuera del bean...en un proyecto aparte donde tengo el bean en la paleta Swing, y lo arrastro al frame. Donde esta el frame esta el main. Creo el BeanInfo y todo correcto en el proyecto del Bean.

agosto 27, 2013 | Unregistered Commentershao

¿Por qué las clases EventoAviso y EventoAvisoListener no son públicas?.
Usas ambas en esa extensión de JButton, por lo que no son accesibles, si las declaras en un package diferente.

agosto 27, 2013 | Registered Commenterchoces

jeje Ok choces...gran despiste por confiar en NetBeans....
Me ha solucionado lo de que me reconoce las clases...pero ahora...no me va! No hace nada...nunca se lanza el evento EventoAviso, aunque le haga click al botón....
A ver si me puedes ayudar....

agosto 27, 2013 | Unregistered Commentershao

No entiendo el sentido de este línea: iterator i = listeners.listIterator(0);

agosto 27, 2013 | Registered Commenterchoces

Prueba a volver a declarar lo que sigue:

LinkedList<EventoAvisoListener> listeners;

private void fireEventoAviso(EventoAviso ea) {
for (Iterator<EventoAvisoListener> it = listeners.iterator(); it.hasNext();) {
it.next().procesarAviso(ea);
}
}

Si todavía no te funciona, comprueba que la lista listeners contiene entradas, cuando llames a ese método.

agosto 27, 2013 | Registered Commenterchoces

Hola choces de nuevo,
disculpa que haya tardado en contestar pero he ido un poco liado...
A ese método nunca llega...es más el método actionPerformed que sobrescribo del JButton en la clase donde defino el Bean tampoco llega a ejecutarse.
La lista efectivamente tiene un listener....tamaño 1...
sabes cual es el problema????
Gracias.
Saludos.

agosto 29, 2013 | Unregistered Commentershao

Buenas,

Yo sin tener ni idea de swing, me aventuro a decir que no estas enlazando el actionListener al Button, por lo que el evento actionperformed no se captura nunca.

Supongo que bastaria con poner en el constructor del TPAviso algo como:
this.addActionListener(this);

P.D: perdon si he dicho una burrada

Un saludo,

agosto 29, 2013 | Unregistered CommenterUnoPorAhi

No me había fijado, hasta ahora, que no añades el ActionListener en el constructor del botón.
Podrías hacer lo que sigue:

public TPAviso() {
this(60);
}

public TPAviso(String aMensaje, int aPeriodoSegs) {
this(aPeriodoSegs);
this.mensaje = aMensaje;
}

private TPAviso(int aPeriodoSegs) {
this.periodoSegs = aPeriodoSegs;
t = new Timer(1000 * aPeriodoSegs, TPAviso.this);
this.listeners = new LinkedList();
addActionListener(TPAviso.this);
}

Procura usar genéricos. Te ahorrarás muchos "disgustos" ;)

agosto 29, 2013 | Registered Commenterchoces

No has dicho ninguna burrada @UnoPorAhi
Solo que te me has adelantado, mientras editaba el mensaje, para poder usar un constructor privado, y no repetir tanto código ;)

agosto 29, 2013 | Registered Commenterchoces

Hola de nuevo,
ok...ese detalle se me había pasado...pero...me sigue sin funcionar!!!! solo tengo ganas de llorar...por qué???? Nunca se ejecuta el método actionPerformed del Bean....
No sé qué hacer más...ayuda por favor...
Saludos.

agosto 31, 2013 | Unregistered Commentershao

public class EventoAviso extends java.util.EventObject {

private static final long serialVersionUID = 1_554_338_488_213_219_821L;

EventoAviso(Object s) {
super(s);
}
}

septiembre 1, 2013 | Registered Commenterchoces

public interface EventoAvisoListener extends java.util.EventListener {

void procesarAviso(EventoAviso ev);
}

septiembre 1, 2013 | Registered Commenterchoces