2010-11-20 16 views
5

Mi objetivo final es tener una JList que refresque su contenido en tiempo de ejecución, y he encontrado una solución que funciona desde esta publicación here on SO, pero tengo curiosidad por saber por qué mi idea original no.Usando el método JList .setModel() con una clase como argumento

A partir de ahora, tengo algo parecido a esta configuración y funciona:

DefaultListModel default = new DefaultListModel(); 

for(int i = 0; i < array.size() ; ++i){ 
    test.addElement(array.get(i)); 
} 
list.setModel(default); 

abajo era mi plan original. Quería tener una clase que implementara ListModel pasar como un argumento, con la esperanza de que actualice la JList.

SomeClass test = new SomeClass(); //Implements ListModel 
list.setModel(test); 

o

SomeClass test = new SomeClass(); //Implements ListModel 
list = new JList(test); 

Ninguno de estos trabajos, lo que me confunde. Si estos dos últimos métodos funcionan de alguna manera, el código es mucho más limpio.

Gracias.

+0

Pasar una clase ListModel en lugar de una instancia de esta clase es un error del compilador. ¿Por qué estás confundido? – Istao

+0

Creo que mi demo del código es un poco engañosa, lo siento. Eso es lo que estaba haciendo, voy a cambiar el código para que quede más claro. – Koop

+1

¿Por qué no funcionan esos dos últimos métodos? Por favor ingrese el error que está viendo. Si 'SomeClass' extiende' ListModel', entonces ambos métodos funcionarán. –

Respuesta

3

El primer enfoque debería funcionar si implementa el ListModel correctamente. La clave es que al cambiar los datos que necesita para invocar:

fireContentsChanged(...); 

del AbstractListModel (que supongo extiendes). La invocación de este método le indicará a la JList que se vuelva a pintar.

El segundo enfoque no funcionará porque acaba de crear un nuevo componente JList que está en la memoria. Crear el componente no lo agrega a la GUI. Por lo tanto, si utiliza este enfoque, debe eliminar la Lista J original de la GUI y luego agregar su nueva Lista J a la GUI. Esto no es muy conveniente y es una buena razón por la cual no se debe usar este enfoque. Establecer el modelo siempre es el enfoque preferido.

+0

¿se supone que fireContentsChanged() forma parte de AbstractListModel o de un método personalizado? Además, ¿esto simplemente reitera a través de todos los valores? Gracias. – Koop

+0

Cuando agrega un ListModel a una JList, la JList agrega un detector al modelo. Cuando cambia el modelo, el modelo notifica a la vista (la lista) que los datos han cambiado para que la vista pueda repintarse. Esta notificación se realiza mediante los métodos fireXXX que forman parte de AbstractListModel. Es por eso que cuando creas un modelo personalizado, debes extender el modelo abstracto para que no tengas que reinventar la rueda y notificar a la vista. Todo lo que haces es invocar el método apropiado fireXXX. – camickr

1

El primer caso parece una solución en mi mente. ¿Puedes proporcionar un ejemplo comprobable?

El segundo caso no funcionará porque solo está reutilizando una variable y no está realmente cambiando la lista J en la interfaz gráfica de usuario. Supongo que ya agregaste esta lista al chico antes en el código.

0

Es muy probable que su implementación de ListModel sea incorrecta.

Cuestiones relacionadas