2010-11-20 22 views
5

Mon but ultime est d'avoir un JList qui actualise son contenu lors de l'exécution, et j'ai trouvé une solution qui fonctionne à partir de ce post here on SO, mais je suis curieux de savoir pourquoi mon idée originale n'a pas.Utilisation de la méthode JList .setModel() avec une classe comme argument

A partir de maintenant, j'ai quelque chose comme cette configuration et il fonctionne:

DefaultListModel default = new DefaultListModel(); 

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

Ci-dessous était mon plan initial. Je voulais que la classe implémentant ListModel soit passée en argument, en espérant qu'elle rafraîchirait le JList.

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

ou

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

Aucune de ces travaux, ce qui me confond. Est-ce que ces deux dernières méthodes pourraient fonctionner, le code est tellement plus propre.

Merci.

+0

Passer une classe ListModel au lieu d'une instance de cette classe est une erreur du compilateur. Pourquoi êtes-vous confus? – Istao

+0

Je pense que ma démo de code est un peu trompeuse désolé. C'est ce que je faisais, je vais changer le code pour le rendre plus clair. – Koop

+1

Pourquoi ces deux dernières méthodes ne fonctionnent-elles pas? S'il vous plaît fournir l'erreur que vous voyez. Si 'SomeClass' étend' ListModel', alors ces deux méthodes fonctionneront. –

Répondre

3

La première approche devrait fonctionner si vous implémentez le ListModel correctement. La clé est que lorsque vous modifiez les données que vous devez invoquer: du AbstractListModel (que je suppose que vous étendez)

fireContentsChanged(...); 

. Invoquer cette méthode demandera à JList de se repeindre.

La deuxième approche ne fonctionnera pas car vous venez de créer un nouveau composant JList qui est en mémoire. La création du composant ne l'ajoute pas à l'interface graphique. Donc, si vous utilisez cette approche, vous devez supprimer le JList original de l'interface graphique, puis ajoutez votre nouvelle JList à l'interface graphique. Ce n'est pas très pratique et c'est une bonne raison pour laquelle cette approche ne devrait pas être utilisée. Définir le modèle est toujours l'approche préférée.

+0

est fireContentsChanged() supposé faire partie de AbstractListModel ou une méthode personnalisée? Aussi, cela réitère-t-il simplement à travers toutes les valeurs? Merci. – Koop

+0

Lorsque vous ajoutez un ListModel à un JList, le JList ajoute un écouteur au modèle. Lorsque vous modifiez le modèle, le modèle notifie à la vue (la liste) que les données ont été modifiées afin que la vue puisse se repeindre. Cette notification est effectuée par les méthodes fireXXX qui font partie du AbstractListModel. C'est pourquoi lorsque vous créez un modèle personnalisé, vous devez étendre le modèle abstrait pour ne pas avoir à réinventer la roue et à notifier la vue. Tout ce que vous faites est d'appeler la méthode fireXXX appropriée. – camickr

1

Le premier cas semble être une solution dans mon esprit. Pouvez-vous fournir un exemple testable?

Le deuxième cas ne fonctionnera pas car vous réutilisez simplement une variable et ne modifiez pas réellement le JList sur le Gui. Je suppose que vous avez déjà ajouté cette liste au gars plus tôt dans le code.

0

Votre implémentation de ListModel est probablement incorrecte.