À l'aide de la JList .setModel() la méthode avec une classe comme un argument
Mon but ultime est d'avoir une JList qui actualise son contenu au moment de l'exécution, et j'ai trouvé une solution qui fonctionne à partir de ce post ici DONC, mais je suis curieux de savoir pourquoi mon idée de départ n'a pas.
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 a été mon plan initial. Je voulais avoir une classe qui a mis en place ListModel être passé comme argument, en espérant qu'il serait actualiser la 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. Ces deux dernières méthodes de travail d'une certaine façon, le code est beaucoup plus propre.
Grâce.
Passant une classe ListModel à la place d'une instance de cette classe est un compilateur d'erreur. Pourquoi êtes-vous confus ?
Je pense que mon code démo est un peu trompeur, désolé. C'est ce que je faisais, je vais modifier le code pour que cela soit plus clair.
Pourquoi ne pas ces deux dernières méthodes de travail? Veuillez fournir l'erreur que vous voyez. Si
votre SomeClass code serait bon de voir.
Je pense que mon code démo est un peu trompeur, désolé. C'est ce que je faisais, je vais modifier le code pour que cela soit plus clair.
Pourquoi ne pas ces deux dernières méthodes de travail? Veuillez fournir l'erreur que vous voyez. Si
SomeClass
s'étend ListModel
, puis les deux de ces méthodes de travail.votre SomeClass code serait bon de voir.
OriginalL'auteur Koop | 2010-11-20
Vous devez vous connecter pour publier un commentaire.
La première approche devrait fonctionner si vous mettez en œuvre la ListModel correctement. La clé est que lorsque vous modifiez les données, vous devez invoquer:
de la AbstractListModel (qui, je suppose, vous étendre). L'invocation de cette méthode se dire à la JList à repeindre.
La deuxième approche ne fonctionnera pas parce que vous venez de créer un nouveau composant JList qui est assis dans la mémoire. La création du composant n'a pas l'ajouter à l'interface graphique. Donc, si vous utilisez cette approche, vous devez supprimer l'original JList partir de l'interface graphique, puis ajoutez votre new JList de l'interface graphique. Ce n'est pas très pratique et c'est une bonne raison pourquoi cette approche ne doit pas être utilisé. Fixant le modèle est toujours la meilleure approche.
Lorsque vous ajoutez un ListModel à une JList, la JList ajoute un écouteur pour le modèle. Lorsque vous modifiez le modèle, le modèle notifie la vue (la liste) que les données ont changé, de sorte que la vue peut se repeindre. Cette notification est effectuée par le fireXXX méthodes qui font partie de la AbstractListModel. C'est pourquoi, lorsque vous créez un modèle sur mesure, vous devez étendre le modèle abstrait pour vous n'avez pas à réinventer la roue et de la notifier à la vue. Tout ce que vous faire est d'appeler le juge approprié fireXXX méthode.
OriginalL'auteur camickr
Le premier cas semble être une solution dans mon esprit. Pouvez-vous fournir un testable exemple?
Le second cas ne fonctionnera pas parce que vous êtes juste la réutilisation d'une variable et ne sont pas réellement changer la JList sur l'interface graphique. Je suis en supposant que vous avez déjà ajoutés à cette liste pour le gars plus haut dans le code.
OriginalL'auteur jzd
Plus probable que votre mise en œuvre de ListModel est faux.
OriginalL'auteur milan
Pourquoi ne pas utiliser:
OriginalL'auteur Trevor Dndreezy Netshisaulu