2010-11-20 14 views
5

Il mio obiettivo finale è avere una JList che aggiorni il suo contenuto in fase di esecuzione e ho trovato una soluzione che funziona da questo post here on SO, tuttavia sono curioso del perché la mia idea originale no.Utilizzo del metodo JList .setModel() con una classe come argomento

A partire da ora, ho qualcosa di simile impostazione e funziona:

DefaultListModel default = new DefaultListModel(); 

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

Qui di seguito è stato il mio piano originale. Volevo avere una classe che implementasse ListModel come argomento, sperando che aggiornasse JList.

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

o

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

Nessuno di questi lavori, che mi confonde. Questi ultimi due metodi potrebbero funzionare come, il codice è molto più pulito.

Grazie.

+0

Passare una classe ListModel invece di un'istanza di questa classe è un errore del compilatore. Perché stai confondendo? – Istao

+0

Penso che la mia demo del codice sia un po 'ingannevole. Questo è quello che stavo facendo, cambierò il codice per renderlo più chiaro. – Koop

+1

Perché questi ultimi due metodi non funzionano? Si prega di fornire l'errore che stai vedendo. Se 'SomeClass' estende' ListModel', allora entrambi i metodi funzioneranno. –

risposta

3

Il primo approccio dovrebbe funzionare se si implementa correttamente il ListModel. La chiave è che quando si modificano i dati necessari per invocare:

fireContentsChanged(...); 

dal AbstractListModel (che presumo si estende). Invocare questo metodo dirà alla JList di ridisegnarsi.

Il secondo approccio non funzionerà perché è sufficiente creare un nuovo componente JList che si trova nella memoria. La creazione del componente non la aggiunge alla GUI. Quindi, se si utilizza questo approccio, è necessario rimuovere il JList originale dalla GUI e quindi aggiungere il nuovo JList alla GUI. Questo non è molto conveniente ed è una buona ragione per cui questo approccio non dovrebbe essere usato. L'impostazione del modello è sempre l'approccio preferito.

+0

è fireContentsChanged() dovrebbe essere parte di AbstractListModel o un metodo personalizzato? Inoltre, questo semplicemente reiterare attraverso tutti i valori? Grazie. – Koop

+0

Quando si aggiunge un ListModel a una JList, JList aggiunge un listener al modello. Quando si modifica il modello, il modello notifica alla vista (l'elenco) che i dati sono stati modificati in modo che la vista possa ridisegnarsi. Questa notifica viene eseguita dai metodi fireXXX che fanno parte di AbstractListModel. Ecco perché quando crei un modello personalizzato devi estendere il modello astratto per non dover reinventare la ruota e notificare la vista. Tutto ciò che fai è invocare il metodo fireXXX approriate. – camickr

1

Il primo caso sembra una soluzione nella mia mente. Puoi fornire un esempio testabile?

Il secondo caso non funziona perché si sta riutilizzando una variabile e in realtà non si sta modificando JList sul Gui. Suppongo che tu abbia già aggiunto questa lista al ragazzo prima nel codice.

0

Molto probabilmente l'implementazione di ListModel è errata.

Problemi correlati