Foro sobre Java SE > Duda Eventos JavaBeans
No somos adivinos.
Si no planteas con detalle, y con código, el problema que tienes, cierro este hilo.
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.
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.
¿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.
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....
No entiendo el sentido de este línea: iterator i = listeners.listIterator(0);
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.
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.
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,
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" ;)
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 ;)
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.
public class EventoAviso extends java.util.EventObject {
private static final long serialVersionUID = 1_554_338_488_213_219_821L;
EventoAviso(Object s) {
super(s);
}
}
public interface EventoAvisoListener extends java.util.EventListener {
void procesarAviso(EventoAviso ev);
}
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.