Foros del Web » Programación para mayores de 30 ;) » Java »

Bindear JList con beans

Estas en el tema de Bindear JList con beans en el foro de Java en Foros del Web. Lo que intento es tener una clase que almacene una lista de objetos, que tienen ciertos atributos y mostrar en un JList esa lista. Para ...
  #1 (permalink)  
Antiguo 26/08/2009, 02:50
 
Fecha de Ingreso: febrero-2005
Mensajes: 34
Antigüedad: 19 años, 3 meses
Puntos: 1
Bindear JList con beans

Lo que intento es tener una clase que almacene una lista de objetos, que tienen ciertos atributos y mostrar en un JList esa lista.
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:
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;
    }
}
Como se ve, hay una lista con los datos y un método que inserta nuevos datos, con aviso de cambios.

Ahora el código donde se usa:
Código:
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();
 
    }
}
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).
  #2 (permalink)  
Antiguo 26/08/2009, 08:01
 
Fecha de Ingreso: mayo-2007
Mensajes: 210
Antigüedad: 17 años
Puntos: 8
Respuesta: Bindear JList con beans

EL problema es que para crear la lista usas la clase ArrayList y esas clase no arroja evento cuando añades o quitas elementos de la lista, en este caso existe la clase ObservableCollections esta clase tiene un metodo que te permite crear una lista que si arroja eventos al añadir o eliminar elementos, para usarla haces lo siguiente

private List<Evento> logEventos = ObservableCollections.observableList(new ArrayList<Evento>());

Despues le pruebas y con eso se solucionara el problema que tienes.


salu2
  #3 (permalink)  
Antiguo 26/08/2009, 08:31
 
Fecha de Ingreso: febrero-2005
Mensajes: 34
Antigüedad: 19 años, 3 meses
Puntos: 1
Respuesta: Bindear JList con beans

Ya tengo resuelto el problema con el aviso de cambio de propiedad, como el valor antiguo y nuevo eran el mismo, no hacía nada, he colocado un null en el antiguo y listo.

Me queda el problema de como actualizar JList sin tener que hacer "bindingGroup.unbind();
bindingGroup.bind();"

@vdpazmino:
es muy interesante lo que indicas,pero el problema es que ese arraylist es anulado en el constructor, que quizás sea ahí donde deba ser usado (lo inicializa ahí porque algo me lanzaba el típico nullexception). Me tomo nota de eso para el futuro.

Última edición por jotremar; 26/08/2009 a las 08:36 Razón: Editado para insertar réplica
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:59.