Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2032 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  affichage d'une jlist non rafraîchie après des modifs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

affichage d'une jlist non rafraîchie après des modifs

n°885380
andOceans
AMGOD
Posté le 28-10-2004 à 22:41:41  profilanswer
 

Bon, en fait, le titre est un peu faux. La JList se rafraîchit à chaque notifications d'un changement du contenu, mais en fait, elle affiche toujours le même nombre d'élément, ou bug (genre, si l'affichage se fait sur 10 lignes, la dernière colonne s'affiche sur 100 lignes (le reste des éléments de la liste) mais sans scrollbar ni rien, enfin, n'importe quoi en gros), et il faut que je redimensionne la fenêtre par exemple, pour qu'elle affiche correctement le contenu.
 
La Jlist est placée dans un JScrollPane.
 
Voici le modèle :

Code :
  1. public class ListImagesModel extends Observable implements ListModel, Observer {
  2. ...
  3. protected File[] filesList = null;
  4. public ListImagesModel(FSeekerModel fsm) {
  5.  this.fsm = fsm;
  6.  fsm.addObserver(this);
  7.  ... // du blabla qui modifie filesList
  8. }
  9. public void update(Observable o, Object caller) {
  10.  ... // du blabla qui modifie filesList
  11.  setChanged();
  12.  notifyObservers(caller);
  13. }
  14. public int getSize() { return filesList.length; }
  15. public Object getElementAt(int index) { return filesList[index]; }
  16. ...


 
Et là, la vue associée :
 

Code :
  1. public class ListImagesGUI extends JList implements Observer {
  2. protected ListImagesModel m = null;
  3. public ListImagesGUI(ListImagesModel m) {
  4.  this.m = m;
  5.  m.addObserver(this);
  6.  setModel(m);
  7.  setVisibleRowCount(0);
  8.  setLayoutOrientation(JList.VERTICAL_WRAP);
  9. }
  10. public void update(Observable o, Object caller) {
  11.  repaint();
  12.  revalidate();
  13. }
  14. ...


 
En gros, la démarche, c'est : quand je modifie un modèle global, update() dans listimagesmodel se déclenche, rafraichit filesList, et déclenche l'update du listimagesgui, qui se rafraîchit. Or, ca se rafraichit, mais mal !
 
Que puis je faire pour résoudre ça ?

mood
Publicité
Posté le 28-10-2004 à 22:41:41  profilanswer
 

n°885391
nraynaud
lol
Posté le 28-10-2004 à 22:51:16  profilanswer
 

virer toute ta sousclasse de jlist.


---------------
trainoo.com, c'est fini
n°885398
andOceans
AMGOD
Posté le 28-10-2004 à 23:07:42  profilanswer
 

euh, hein ?
pas extends JList tu veux dire ?

n°885401
nraynaud
lol
Posté le 28-10-2004 à 23:09:05  profilanswer
 

oui. en général on a pas besoin de sous-classe les composants swing. j'irais même jusqu'à dire que ça ne m'est jamais arrivé sauf pour un bidouille avec JLabel (pour les Renderers).


---------------
trainoo.com, c'est fini
n°885402
andOceans
AMGOD
Posté le 28-10-2004 à 23:11:12  profilanswer
 

Okas, je vais allez faire en composition alors.

n°885409
nraynaud
lol
Posté le 28-10-2004 à 23:15:43  profilanswer
 

oué, c'est mieux


---------------
trainoo.com, c'est fini
n°885410
andOceans
AMGOD
Posté le 28-10-2004 à 23:15:57  profilanswer
 

Bon, ça fait toujours pareil.
 
Another idea ?

n°885423
andOceans
AMGOD
Posté le 28-10-2004 à 23:22:58  profilanswer
 

Pour montrer un peu :
 
le mauvais :
http://img25.exs.cx/img25/9427/badgui.th.jpg
 
le bon :
http://img25.exs.cx/img25/549/goodgui.th.jpg

n°885469
the real m​oins moins
Posté le 29-10-2004 à 01:40:57  profilanswer
 

[:blueflag]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°885483
nraynaud
lol
Posté le 29-10-2004 à 06:39:26  profilanswer
 

andOcean > vire toutes tes preferred size et minimal sizes.
 
par contre faire un overflow horizontal on évite en général.
 
 
pour ceux qui seraient étonné de voir une liste sur plusieurs colones, il a utilisé  HORIZONTAL_WRAP.


---------------
trainoo.com, c'est fini
mood
Publicité
Posté le 29-10-2004 à 06:39:26  profilanswer
 

n°885484
nraynaud
lol
Posté le 29-10-2004 à 06:40:34  profilanswer
 

la règle générale > si ça dégueule pas dans le bon sens, c'est probablement qu'on a joué avec des machinSize.


---------------
trainoo.com, c'est fini
n°885646
andOceans
AMGOD
Posté le 29-10-2004 à 11:17:25  profilanswer
 

Je voudrais bien nraynaud, le problème, c'est que comme tu peux le voir dans le code de mon 1er message, il n'y a aucun machinSize. (et oui, c'est un horizontal_wrap dans les s/s là, pas le vertical_wrap du code dessus ;o)

n°885647
nraynaud
lol
Posté le 29-10-2004 à 11:20:15  profilanswer
 

et le visibleRowCount ?

n°885651
nraynaud
lol
Posté le 29-10-2004 à 11:21:52  profilanswer
 

je dois t'avouer que j'ai jamais utilisé ça, mais normalement, ça respecte la règle de la surprise minimum, donc, il faut mettre un minimum de configuration.

n°885661
andOceans
AMGOD
Posté le 29-10-2004 à 11:33:02  profilanswer
 

Que je l'enlève, ou que je mettes une constante > 0, ça bug toujours. Et puis, le code dessus, c'est un code simplifié. Il y a plus d'options dans le vrai code, mais je l'ai simplifié au maxi. Et même en mettant plein de config, il est toujours là le bug.

n°885668
nraynaud
lol
Posté le 29-10-2004 à 11:43:02  profilanswer
 

justement, vire toute la config.
 
tu veux afficher quoi exactement ? une liste sur plusieurs colones comme dans un journal ?

n°885682
andOceans
AMGOD
Posté le 29-10-2004 à 11:55:43  profilanswer
 

La config est viré ! J'ai tout mis en commentaire, sauf le bout que je montre dans mon 1er message.
 
Je voudrais qu'il affiche correctement _tout_ le contenu, tout simplement. Pour l'instant, comme j'ai dis, il n'affiche pas tout, ou n'importe comment. Il faut que je redimensionne la fenêtre pour mettre à jour correctement.

n°885698
nraynaud
lol
Posté le 29-10-2004 à 12:16:23  profilanswer
 

simplement une colone, tout bête ????
 
ben tu fais juste panel.add(new JScrollPane(new JList(tonmodel)));
 
par contre, j'ai un doute, tu utilises quoi comme ListModel ? un truc perso ?

n°885700
andOceans
AMGOD
Posté le 29-10-2004 à 12:19:02  profilanswer
 

Non, pas une seule colonne, regardes les s/s. C'est la version "bonne" que je veux. (mais après, ca dépend juste du wrap, j'utilise les deux dans mon cas, + renderer etc. mais ça n' pas d'influence tout ça).
 
Le ListModel, oui il est perso, voir le code 1er message.

n°885701
nraynaud
lol
Posté le 29-10-2004 à 12:19:45  profilanswer
 

merde, j'ai pas été revoir le code là-haut /o\
file-moi le code complet du listmodel stp.

n°885703
andOceans
AMGOD
Posté le 29-10-2004 à 12:23:33  profilanswer
 

Bah, y'a pas grand chose en plus du code en haut.
 

Code :
  1. public class ListImagesModel extends Observable implements ListModel, Observer {
  2. protected MainModel fsm = null;
  3. protected File[] filesList = null;
  4. public ListImagesModel(MainModel fsm) {
  5.  this.fsm = fsm;
  6.  fsm.addObserver(this);
  7.  filesList = getModel().getFilesList();
  8. }
  9. public MainModel getModel() { return fsm; }
  10. public void update(Observable o, Object caller) {
  11.  filesList = getModel().getFilesList();
  12.  setChanged();
  13.  notifyObservers(caller);
  14. }
  15. public int getSize() { return filesList.length; }
  16. public Object getElementAt(int index) { return filesList[index]; }
  17. public void addListDataListener(ListDataListener l) {}
  18. public void removeListDataListener(ListDataListener l) { }
  19. }

n°885714
nraynaud
lol
Posté le 29-10-2004 à 12:38:22  profilanswer
 

ok, j'ai trouvé : tu as tout faux sur le pattern listener.
 
tu as le code source du JDK ? va voir la classe DefaultListModel.  
 
 
La JList va enregistrer un éclaireur dans le model par addListDataListener() quand le modèle va se modifier, il doit envoyer un ListDataEvent à tous les Listeners qui se sont enregistrés.  
 
Donc il faut que addListDatalistener mette le listener reçu en paramètre dans une collection et que dans update() tu envoies le bon évènement à chacun des listeners dans la collection.

n°885738
andOceans
AMGOD
Posté le 29-10-2004 à 12:58:53  profilanswer
 

Euh, du genre ...
 

Code :
  1. protected List listeners = new ArrayList();
  2. public void addListDataListener(ListDataListener l) {
  3.  if (l != null && !listeners.contains(l))
  4.   listeners.add(l);
  5. }
  6. public void removeListDataListener(ListDataListener l) {
  7.  if (l != null)
  8.   listeners.remove(l);
  9. }
  10. public void update(Observable o, Object caller) {
  11.  filesList = getModel().getFilesList();
  12.  Iterator it = listeners.iterator();
  13.  while (it.hasNext())
  14.   ((ListDataListener) it.next()).contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, getSize() - 1));
  15.  /*setChanged();
  16.  notifyObservers(caller);*/
  17. }


 
ca ? Et le gui ajoute un listener, dès qu'il reçoit l'événement, fait un revalidate() + repaint() ?

n°885750
andOceans
AMGOD
Posté le 29-10-2004 à 13:07:06  profilanswer
 

Bon, je crois que ça marche, j'ai codé à la va vite l'implémentation du listdatalistener, avec

Code :
  1. public void contentsChanged(ListDataEvent e) {
  2.  gui.getGUI().revalidate();
  3.  gui.getGUI().repaint();
  4. }


et ça fonctionne. Je vais nettoyer un peu, mais c'est bon quoi.
 
Merci beaucoup nraynaud !

n°885759
andOceans
AMGOD
Posté le 29-10-2004 à 13:12:05  profilanswer
 

Tiens, mais en fait, je peux laisser la méthode contentsChanged vide, et décommenter le setChanged() et notifyObservers() de l'update du modèle. Ca fonctionne toujours. Je comprends pas trop pourquoi, je n'ai fait que rajouter le truc qui gère les listeners dont je ne me sert même pas en fait. (meme plus de addListDataListener dans le gui)
 
Enfin, ça marche impec'.
 
edit: ah oui, c'est Swing qui rajoute lui même un listener : javax.swing.plaf.basic.BasicListUI$Handler@b09e89


Message édité par andOceans le 29-10-2004 à 13:16:31
n°885771
nraynaud
lol
Posté le 29-10-2004 à 13:25:37  profilanswer
 

voiloù ; fais bien gaffe à envoyer exactement le bon type dévènement dans la bonne situation, mais tu es exactement dans le pattern.

n°885773
andOceans
AMGOD
Posté le 29-10-2004 à 13:31:04  profilanswer
 

Okas. Je viens de soulever un lièvre, ça fait plaisir.
 
Merci bien.

n°885805
the real m​oins moins
Posté le 29-10-2004 à 14:22:14  profilanswer
 

nraynaud a écrit :

ok, j'ai trouvé : tu as tout faux sur le pattern listener.
 
tu as le code source du JDK ? va voir la classe DefaultListModel.  
 
 
La JList va enregistrer un éclaireur dans le model par addListDataListener() quand le modèle va se modifier, il doit envoyer un ListDataEvent à tous les Listeners qui se sont enregistrés.  
 
Donc il faut que addListDatalistener mette le listener reçu en paramètre dans une collection et que dans update() tu envoies le bon évènement à chacun des listeners dans la collection.

y'a pas un AbstractListModel qui fait ?
Observable ça devrait pas etre deprecié ce "truc" ?
(andOceans, tu l'utilises dans quel cadre ce Observable/Observer?)


Message édité par the real moins moins le 29-10-2004 à 14:23:19
n°885856
andOceans
AMGOD
Posté le 29-10-2004 à 15:00:06  profilanswer
 

Si, y'a déjà le abstract et le default qui le font. Je l'utilise pour l'architecture MVC (très pratique) de mon application.
J'aurai bien aimé faire un extends Observable, AbstractListModel mais bon, je vais pas troller. :D

n°885874
the real m​oins moins
Posté le 29-10-2004 à 15:16:34  profilanswer
 

surtout que sans use case qui tienne la route, tu vas vite tomber à court d'arguments. donc tu utilises l'observer/observable pour?

n°885889
andOceans
AMGOD
Posté le 29-10-2004 à 15:28:21  profilanswer
 

Voir le message précédent. Je n'ai que ça à dire. :d

n°885891
the real m​oins moins
Posté le 29-10-2004 à 15:32:51  profilanswer
 

donc  tu etends Observable juste pour dire que ça te fait chier de pas pouvoir faire du double héritage? [:itm]

n°885899
andOceans
AMGOD
Posté le 29-10-2004 à 15:40:54  profilanswer
 

Mais non. Je l'étends pour ne pas l'implémenter.
 
Ce modèle a besoin d'être observable, ie : dans le gui, j'ai m.addObserver(this); avec m, ce modèle, pour que dès que c'est modifié, ça appelle le update() de ce gui. J'ai pas mal de vues, et de modèles dans l'application, j'uniformise tout. Je ne vais pas aller m'amuser à étudier chaque cas pour savoir comment je pourrais faire sans, ça serait contraire à la logique de garder la modularité du MVC.

n°885906
the real m​oins moins
Posté le 29-10-2004 à 15:45:18  profilanswer
 

mais le ListModelListener est là pour ça non ? Tu devrais pas avoir à updater la gui "à la main" il me semble :??:

n°885925
andOceans
AMGOD
Posté le 29-10-2004 à 15:57:30  profilanswer
 

Oui, aussi en fait. J'ai tout réécris en utilisant ça, ça fonctionne pareillement, c'est vrai. Et ça me permet de extends l'abstractlistmodel, donc de virer mes méthodes réécrits, sympathique tout compte fait. C'est vrai que c'était assez évident, je devais être enfermé dans mon MVC pur main, pour ne pas y penser. :|

n°885926
the real m​oins moins
Posté le 29-10-2004 à 15:58:16  profilanswer
 

et voilà [:djswad]

n°885932
andOceans
AMGOD
Posté le 29-10-2004 à 16:01:35  profilanswer
 

Merci à toi aussi. :love:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  affichage d'une jlist non rafraîchie après des modifs

 

Sujets relatifs
un site pour tester l'affichage sous differents navigateurs ?Affichage de 1er, 2e, 3e etc.
Bouton "modifier les sources" ou menu affichage/source[CSS] Affichage avec Opéra
[Réglé] Espacement, saut de ligne>>MySQL>>Affichage[SDL]SDL_Rect.w =SDL_Surface->w; => Non affichage !
[Resolu] [ASP] PRB avec espace dans une variable et affichage en htmlProblème d'affichage de chaine de caracatères en PHP
noms d'objets réutilisables ? et affichage grid 
Plus de sujets relatifs à : affichage d'une jlist non rafraîchie après des modifs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR