JTree, arborescences et rafraichissement

JTree, arborescences et rafraichissement - Java - Programmation

Marsh Posté le 05-12-2004 à 17:42:57    

Il m'arrive quelque chose de bizarre.
 
J'ai un objet qui a une structure d'arbre, et je sais que cette structure est bonne, et je voudrais l'afficher dans un arbre.
 
J'ai une sous classe de DefautMutableTreeNode, et je crée avec des instances de cette classe une structure en arbre qui est exactement la représentation de la structure à représenter ( j'ai testé en mode texte, elle marche parfaitement).
 
Maintenant, j'ai un  JTree auquel j'applique en root la racine de la structure arborescente.
 
J'ai des problèmes de rafraîchissement. En effet, le JTree affiche bien l'arborescence que je lui file, mais si je la modifie en route, y'a des bugs étranges.
 
Je précise que, n'ayant pas eu envie de réfléchir trop, pour rafraichir ma stucture de MutableTreeNodes, je fais un removeAllChildren() sur la racine et je reconstruis tout (mais de toutes façons, c'est pas le problème puisque cette structure est bonne).
 
regardez ça :
 
 
ça c'est quand je lui file une arbo vide :
http://tom.rethaller.free.fr/_lab/uni/scr_0.png
 
 
maintenat j'ajoute un truc dans la structure à représenter, je reconstruis mon arborescence de TreeNodes depuis le début, et j'affiche avec un repaint(); :
 
http://tom.rethaller.free.fr/_lab/uni/scr_1.png
 
 
super, ça a marché nickel et là je recommence pour un second :
 
http://tom.rethaller.free.fr/_lab/uni/scr_2.png
 
 
vous remarquerez que le petit trait vertical a disparu (et il ne revient pas après un autre repaint donc, c'est un vrai problème)
 
 

en fait, le TreeNode que j'ai ajouté est bien présent dans l'arbo, mais le JTree ne  l'affiche pas, même si y'a une différence après, c'est pas exactement celle que je veux.

 
 
vous savez comment je pourrais être sûr qu'il s'est bien updaté après modification de l'arbo ?

Reply

Marsh Posté le 05-12-2004 à 17:42:57   

Reply

Marsh Posté le 05-12-2004 à 18:03:25    

le repaint(), c'est une baffe !
 
 
tu dois faire toutes tes modification de la structure par model.insert(). et pas directement sur la racine ou les noeuds.
 
fais voir ton code complet ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 05-12-2004 à 18:24:04    

nraynaud a écrit :

le repaint(), c'est une baffe !


 
ah ouais ?  
 

nraynaud a écrit :


tu dois faire toutes tes modification de la structure par model.insert(). et pas directement sur la racine ou les noeuds.


 
argh... mais comment je peux faire si je veux, non pas modifier mais reconstruire l'arbre depuis le début ?
 
 

nraynaud a écrit :


fais voir ton code complet ?


 
heu.. complet je pense pas, mais  je vais essayer de montrer un truc compréhensible, en fait, j'ai 3 niveaux de profondeur, et j'ai sous-classé DefaultMutableTreeNode 3 fois pour chaque niveau de profondeur et pis.... pff ouais j'ai 5 ~ 6 classes juste pour ça
 
j'arrive

Reply

Marsh Posté le 05-12-2004 à 18:37:07    

Code :
  1. // donc ça c'est le root, Etablissement, qui contient des promos
  2. public class EtablissementTreeNode extends UniTreeNode {
  3. Donnees donnees;
  4. // ...
  5. public void actualiser() {
  6.  Object[] _promos = donnees.getPromotions();
  7.  removeAllChildren();
  8.  for (int i = 0; i < _promos.length; ++i) {
  9.   PromotionTreeNode _promo = new PromotionTreeNode((Promotion) _promos[i]);
  10.   _promo.actualiser();
  11.   ajouterPromotion(_promo);
  12.  }
  13. }
  14. }
  15. // pis après, chaque Promotion contient des ClasseGroupe, et chaque ClasseGroupe contient un Groupe  
  16. public class ClasseGroupeTreeNode extends UniTreeNode {
  17. // ...
  18. public void actualiser(){
  19.  Object[] _groupes=classeGroupe.getGroupes();
  20.  removeAllChildren();
  21.  for(int i=0; i<_groupes.length; ++i){
  22.   ajouterGroupe(new GroupeTreeNode((Groupe)_groupes[i]));
  23.  }
  24. }
  25. }


 
donc en fait, j'ai un actualiser général qui appele les actualiser() des neuds enfants.
 
donc vous voyez, ça a rapport avec des établissement universitaires, et désolé, c'est en français mais ça j'ai pas trop le choix
 
 
ah oui, dans ma classe où j'apelle tout ça :

Code :
  1. private EtablissementTree getEtablissementTree() {
  2.  if (etablissementTree == null) {
  3.   arbo=new EtablissementTreeNode(Donnees.getDonneesGlobales()); // ouais, c'est un singleton qui contient tout ce dont j'ai besoin, c'est ces données que je modifie en cours de root
  4.   arbo.actualiser();
  5.   etablissementTree = new EtablissementTree(arbo);
  6.   etablissementTree.ajouterChangeSelectionListener(new ChangeSelectionGestionnaire()); //  désolé... :(
  7.  }
  8.  return etablissementTree;
  9. }


 
parce que bon, moi modifier en fait, je vais pas le faire, sinon, je vais toujours devoir modifier 2 trucs en même temps, je préfèrerais faire un reset directement sur le TreeNode root, ou même sur le JTree, de toutes façons, cette partie là du code est assez pourrite donc je suis plus à ça près
 

Reply

Marsh Posté le 05-12-2004 à 18:44:43    

raytaller a écrit :

argh... mais comment je peux faire si je veux, non pas modifier mais reconstruire l'arbre depuis le début ?

tu refait tout depuis la racine, puis tu fais un model.setRoot() ou un truc du style.
(comme tu commences à être autonome et que je suis en 56k, je fais tout de tête, à toi de faire google pour vérifier les noms des fonctions).
 
L'idée c'est que les noeuds et la racine ne son pas observés par la vue, mais uniquement le modèle. Donc toute modif doit être faite par le modèle et pas directement dans les noeuds.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 05-12-2004 à 18:50:17    

l'histoire du modèle qui modifie l'arbre, c'est le Pattern "Façade", le modèle est une façade pour tout le bordel de l'arbre.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 05-12-2004 à 18:54:42    

je regarde ça, merci et

nraynaud a écrit :

je suis en 56k, je fais tout de tête

mes respects.

Reply

Marsh Posté le 05-12-2004 à 19:16:40    

yaaarghghgh
 
ça marche.
maintenant je vais méditer sur ce que tu as écrit, je débute en patterns
 
merci

Reply

Marsh Posté le 06-12-2004 à 16:39:56    

Il me semble qu'il y'avait un truc du genre updateTreeUI qui permettait de rafraichir l'arbre en cas de modification (c'est vieux dans ma tête).

Reply

Marsh Posté le 02-11-2009 à 11:16:58    

Merci pour le JTree.updateUI() !
Comme quoi, les vieux forums, ça sert toujours...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed