Foro sobre Java SE > Duda Eventos JavaBeans
public class PruebaFrameEventosBeans extends javax.swing.JFrame {
private static final long serialVersionUID = 3_789_472_874_731_305_705L;
public PruebaFrameEventosBeans() {
initComponents();
((TPAviso) jButtonPrueba).setMensaje("Prueba de evento de botón");
((TPAviso) jButtonPrueba).addEventoAvisoListener(new EventoAvisoListener() {
@Override
public void procesarAviso(EventoAviso ev) {
System.out.println("Holaaaaa");
}
});
}
@SuppressWarnings("unchecked")
private void initComponents() {
jButtonPrueba = new TPAviso();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(new java.awt.FlowLayout());
jButtonPrueba.setText("Prueba");
getContentPane().add(jButtonPrueba);
pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new PruebaFrameEventosBeans().setVisible(true);
}
});
}
private javax.swing.JButton jButtonPrueba;
}
Muchas gracias choces, siempre me salvas!!!
Pero una duda...qué le pasaba a mi código??? La única diferencia que he visto es esto:
private static final long serialVersionUID = 1_554_338_488_213_219_821L;
para qué es???
He comentado dicha línea y sigue funcionando....:S
Saludos.
Esa línea, y otras parecidas, solamente sirven para identificar correctamente la clase, en caso de serialización. Por eso siempre las creo, por si acaso. Pero no tienen relación con el código específico de la clase; por eso funciona igual aunque las comentes.
No sé exactamente qué le pasaba a tu código, excepto lo que ya comenté en varios mensajes anteriores. Como has visto, me limité a crear la clase TPAviso, con ese par de modificaciones comentadas: una para crear los constructores, añadiendo el listener al botón, y la otra para declarar el procesador de eventos. Al crear los constructores de esa manera, se evita duplicar bloques de código; porque, aparte del listener añadido, el resto es lo que ya tenías hecho.
¿No estaría la diferencia en el uso de esa clase?. Como has visto, he creado un test, donde creo que puede estar la principal diferencia. No sé cómo la has probado, cuando no te funcionaba.
public class TPAviso extends JButton implements ActionListener {
private static final long serialVersionUID = 6_607_615_319_293_862_932L;
private String mensaje;
private int periodoSegs;
private final Timer t;
private final LinkedList<EventoAvisoListener> listeners;
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);
}
@Override
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 void addEventoAvisoListener(EventoAvisoListener l) {
listeners.add(l);
}
public void removeEventoAvisoListener(EventoAvisoListener l) {
listeners.remove(l);
}
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;
}
private void fireEventoAviso(EventoAviso ea) {
for (Iterator<EventoAvisoListener> it = listeners.iterator(); it.hasNext();) {
it.next().procesarAviso(ea);
}
}
}