Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > problema actualizando JList

Hola

Tengo un JList (dentro de un JScrollPane) que los instancio con una clase que implementa ListModel.
La clase ListModel obtiene los datos de otra fuente, por lo que en los metodos getElementAt(int) y getSize() hacen referencia a un Vector que pertenece a otra clase,
es decir, los datos no los guardo en el model.
El problema que tengo es que al añadir elementos al vector el JList no muestra ningún elemento.
Cuando elimino elementos del vector sí funciona.
He probado con list.repaint(), list.revalidate(), scroll.repaint() y scroll.revalidate() . No ha funcionado.


Estas es la clase:

public class MiListModel //extends DefaultListModel
implements ListModel
{

public void addListDataListener(ListDataListener l) {}
public void removeListDataListener(ListDataListener l) {}

public MiListModel()
{
}

public Object getElementAt(int index) {
return Datos.getInstance().getElementos().get(index);
}

public int getSize() {
return Datos.getInstance().getElementos().size();
}
}

¿Alguna idea?

Gracias.

diciembre 17, 2011 | Unregistered Commenterfran

El problema que tienes es que la lista se registra en el modelo con los métodos addListDataListener y removeListDataListener respectivamente. En estos métodos tendrias que agregar el listener en un arraylist (por ejemplo) y seguidamente cuando vayas a actualizar el contenido llamar al método list.intervalAdd(). Algo al estido:

ArrayList<ListDataListener> listeners = new ArrayList<ListDataListener>();
class MiModelo implements ListModel{

@Override
public int getSize() {
return array.size();
}

@Override
public Object getElementAt(int i) {
return array.get(i);
}

@Override
public void addListDataListener(ListDataListener ll) {
listeners.add(ll);
}

@Override
public void removeListDataListener(ListDataListener ll) {
listeners.remove(ll);
}

}

Y cuando agregues los datos, debajo pones:
for(ListDataListener list : listeners)
list.intervalAdded(new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, 0, array.size()));

Cualquier duda avisa!

diciembre 17, 2011 | Registered Commenterjordibr7

Hola
No creo que sea eso.
Pongo a la clase, esta vez no simplificada.
Quiero hacer un JList filtrable, ya que puede tener muchos elementos.
Lo que me trae mosca, es que si hay filtro, el JList se visualiza correctamente, por lo que se comprueba que hay datos. Pero si no hay filtro, no aparece ningun elemento.


public class FiltrableListModel //extends DefaultListModel
implements ListModel, FiltrableListModel
{
private String filtro = null;
private Datos datos = null;
private List<Integer> idxElementosFiltrados = null;

public void addListDataListener(ListDataListener l) {}
public void removeListDataListener(ListDataListener l) {}

public OtroPobladoFiltrableListModel()
{
idxElementosFiltrados = new ArrayList<Integer>();
datosJugador = Datos.getInstance();
}

public Object getElementAt(int index) {
return (filtro == null) ? datos.getElementos().get(index) :
datos.getElementos().get(idxElementosFiltrados.get(index).intValue());
}

public int getSize() {
return (filtro == null) ? datos.getElementos().size() : idxElementosFiltrados.size();
}

// metodo del interfaz FiltrableListModel
public void filtrar(Object fil)
{
if (fil == null || fil.toString().trim().equals("")) {
filtro = null;
return;
}

this.filtro = fil.toString().trim().toUpperCase();
idxElementosFiltrados.clear();

for (Elemento e: datos.getElementos()) {
if (e.getNombre().toUpperCase().indexOf(filtro) != -1) {
idxElementosFiltrados.add(posicion);
}
posicion++;
}
}

}


¿alguna otra idea?

Gracias.

diciembre 17, 2011 | Unregistered Commenterfran