Para ello, tengo hecho un bind entre la clase que tiene la lista y el JList (el enlace se ha creado con el IDE Netbeans). El problema está en que cuando cambia la lista, el JList no se actualiza. Os pongo algo de código, que se entiende mejor.
Esta es la clase que almacena la lista con los datos. Evento es un simple JavaBean con dos atributos.
Código:
Como se ve, hay una lista con los datos y un método que inserta nuevos datos, con aviso de cambios.public class LogEventos { private ArrayList<Evento> eventos = new ArrayList<Evento>(); private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); public ArrayList<Evento> getEventos() { return eventos; } public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); } public void nuevoEvento(Evento evento){ eventos.add(evento); propertyChangeSupport.firePropertyChange("eventos", this.eventos, this.eventos); } public List<Evento> getEventosLista(){ return this.eventos; } }
Ahora el código donde se usa:
Código:
Para empezar, cuando cambia la lista no avisa al observador (con el depurador se ve que está correctamente insertado en la lista de listeners). Para que la JList realmente se actualice, tengo que hacer un rebind (unbind+bind). public class JViewExample extends FrameView { private LogEventos arrayEventos; //objeto con los datos private List<Evento> logEventos = new ArrayList<Evento>(); //Esta variable es la que está enlazada con JList, que ha de ser refrescada con la variable anterior public JViewExample(SingleFrameApplication app) { super(app); initComponents(); arrayEventos = new LogEventos(); arrayEventos.addPropertyChangeListener( new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent propertyChangeEvent) { String property = propertyChangeEvent.getPropertyName(); if ("eventos".equals(property)) { bindingGroup.unbind(); bindingGroup.bind(); } } } ); logEventos = arrayEventos.getEventosLista(); } // este evento está enlazado con un botón private void prueba(java.awt.event.ActionEvent evt) { arrayEventos.nuevoEvento(new Evento("s","a")); //bindingGroup.unbind(); //bindingGroup.bind(); } }