Refresh JTree

Refresh JTree - Java - Programmation

Marsh Posté le 16-06-2006 à 14:54:41    

Hello tout le monde :-)
 
Vala, j'ai un petit soucis  :o  
 
Je vous explique mon soucis, j'affiche une arborescence à partir d'un fichier XML (à l'aide d'un JTree), dans cette arborescence je modifie des valeurs sur des attributs, puis j'enregistre cette nouvelle arbo dans le même fichier XML. (Je l'écrase quoi^^)
 
Le truc c'est que j'aimerais refraichir l'affichage, qui est différent puisque j'ai modifié des valeurs.  :sweat:  
 
Je fais ça: parcours du fichier xml => affichage de ce fichier => modification du fichier sur le dur que j'ai parcouru => ré-affichage en refaisant le parcours de ce fichier.
 
Mon arbre est construit de la façon suivante: tout est sur listener, c'est à dire dés qu'il clique sur un noeud ça expande juste ses fils etc..
 
Merki

Reply

Marsh Posté le 16-06-2006 à 14:54:41   

Reply

Marsh Posté le 16-06-2006 à 14:57:51    

J'ai ca en stock :  
 

Code :
  1. public void updateTree() {
  2.         ((DefaultTreeModel) treeGroup.getModel()).setRoot(createTree());
  3.         ((DefaultTreeModel) treeGroup.getModel()).reload();
  4.     }


 
treeGroup c'est ton JTree
createTree() est une fonction qui genere l'arbre avec des DefaultMutableNode


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 16-06-2006 à 15:18:16    

Hum, moi j'ai des DefaultTreeMutableNode pour mon arbre. Mais j'ai essayé ça (je le met dans mon listener, lorsque l'utilisateur clique sur un bouton present dans un noeud, ça doit faire la mise à jour).
Cela me genere max erreur lol:
 

Code :
  1. java.lang.NullPointerException
  2. at javax.swing.plaf.basic.BasicTreeUI.completeEditing(Unknown Source)
  3. at javax.swing.plaf.basic.BasicTreeUI.completeEditing(Unknown Source)
  4. at javax.swing.plaf.basic.BasicTreeUI.updateCellEditor(Unknown Source)
  5. at javax.swing.plaf.basic.BasicTreeUI.setEditable(Unknown Source)
  6. at javax.swing.plaf.basic.BasicTreeUI$Handler.propertyChange(Unknown Source)
  7. at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
  8. at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
  9. at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
  10. at java.awt.Component.firePropertyChange(Unknown Source)
  11. at javax.swing.JComponent.firePropertyChange(Unknown Source)
  12. at javax.swing.JTree.setEditable(Unknown Source)
  13. at XML.Arbo$1.valueChanged(Arbo.java:139)
  14. at javax.swing.JTree.fireValueChanged(Unknown Source)
  15. at javax.swing.JTree$TreeSelectionRedirector.valueChanged(Unknown Source)
  16. at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(Unknown Source)
  17. at javax.swing.tree.DefaultTreeSelectionModel.clearSelection(Unknown Source)
  18. at javax.swing.tree.VariableHeightLayoutCache.rebuild(Unknown Source)
  19. at javax.swing.tree.VariableHeightLayoutCache.treeStructureChanged(Unknown Source)
  20. at javax.swing.plaf.basic.BasicTreeUI$Handler.treeStructureChanged(Unknown Source)
  21. at javax.swing.tree.DefaultTreeModel.fireTreeStructureChanged(Unknown Source)
  22. at javax.swing.tree.DefaultTreeModel.nodeStructureChanged(Unknown Source)
  23. at javax.swing.tree.DefaultTreeModel.setRoot(Unknown Source)
  24. at XML.Arbo$2.actionPerformed(Arbo.java:231)
  25. at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
  26. at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
  27. at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
  28. at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
  29. at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
  30. at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
  31. at java.awt.Component.processMouseEvent(Unknown Source)
  32. at javax.swing.JComponent.processMouseEvent(Unknown Source)
  33. at java.awt.Component.processEvent(Unknown Source)
  34. at java.awt.Container.processEvent(Unknown Source)
  35. at java.awt.Component.dispatchEventImpl(Unknown Source)
  36. at java.awt.Container.dispatchEventImpl(Unknown Source)
  37. at java.awt.Component.dispatchEvent(Unknown Source)
  38. at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
  39. at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
  40. at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
  41. at java.awt.Container.dispatchEventImpl(Unknown Source)
  42. at java.awt.Window.dispatchEventImpl(Unknown Source)
  43. at java.awt.Component.dispatchEvent(Unknown Source)
  44. at java.awt.EventQueue.dispatchEvent(Unknown Source)
  45. at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
  46. at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
  47. at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
  48. at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
  49. at java.awt.EventDispatchThread.run(Unknown Source)


J'ai mis ça :  

Code :
  1. ((DefaultTreeModel) tree.getModel()).setRoot(top);       
  2.         ((DefaultTreeModel) tree.getModel()).reload();


 
top contient juste l'element racine de mon arbre.
 
[/CODE]

Reply

Marsh Posté le 22-06-2006 à 02:11:10    

perso je me servais de

Code :
  1. ((DefaultTreeModel) tree.getModel()).reload(currentNode);


 
ou currentNode est le noeud de ton arbo sur lequel est basé l'évènement.
 
Sinon essaie de mettre un peu plus de code, parce que voir deux lignes... :o


---------------
Mon feedback
Reply

Marsh Posté le 22-06-2006 à 08:52:58    

En faite voila comment sa marche :
J'ai une arboréscence d'un fichier XML que j'affiche avec un JTree. Ce Jtree se developpe selon le noeud, c'est à dire que je n'affiche que les premiers noeuds, et il se deroule lorsque l'utilisateur clique sur le noeud en question.
Pour faire simple, tout mon arbre est contenu dans des listeners (je ne charge pas toute l'arboréscence en mémoire). Il clique sur un noeud, il va charger ses fils.
 

Code :
  1. final  JTree tree = new JTree(top);
  2. Icon openIcon = new ImageIcon("plus.png" );
  3. Icon closedIcon = new ImageIcon("minus.png" );
  4. ((javax.swing.plaf.basic.BasicTreeUI) tree.getUI()).setExpandedIcon(openIcon);
  5. ((javax.swing.plaf.basic.BasicTreeUI) tree.getUI()).setCollapsedIcon(closedIcon);
  6. tree.getSelectionModel().setSelectionMode (TreeSelectionModel.SINGLE_TREE_SELECTION);
  7. tree.setRootVisible(true);
  8. tree.setShowsRootHandles(false);
  9. tree.setCellRenderer(new Renderer());
  10. Editor ec = new Editor();
  11. tree.setCellEditor(ec);
  12. dtm = new DefaultTreeModel(top);
  13. tree.setModel(dtm);
  14. getContentPane().add(tree);
  15. tree.setEditable(false);
  16. //On utilise un listener sur notre arbre
  17.  test = new TreeSelectionListener() {
  18. public void valueChanged(TreeSelectionEvent arg0)
  19. {....
  20. //Ici j'ai tout le code qui effectue le traitement sur le deroulement de l'arbre, recherche des fils selon, le noeud cliqué etc ...}


 
Pour l'instant j'ai fait sa pour le refresh :

Code :
  1. dispose();
  2. JFrame fii = new Arbo();
  3. tree.setEditable(false);
  4. fii.setVisible(true);


 
Ce code s'execute dans mon listener quand il clique sur un bouton (donc cela doit faire la mise à jour), ça fait ma mise à jour, j'ai pas trouvé mieux...
 
mais le probléme que cela pose est celui-ci :
Le truc c'est que j'effectue une mise à jour lorsque l'utilisateur clique sur des boutons de l'arbre, je dois donc recharger le fichier XML. Je le fais en faisant un dispose() et en relancant ma classe principal.
 
Mais le truc c'est que j'aimerais que lorsque mon programme se relance, il m'expand le chemin ou l'utilisateur a entré sa valeur. (En faite il entre une valeur, appuie sur un bouton, et hop ça relance le tout).
 
Mais comme tout mon arbre n'est pas chargé en mémoire, et qu'il est dans un listener je ne sais pas comment m'y prendre


Message édité par denebj le 22-06-2006 à 08:55:54
Reply

Sujets relatifs:

Leave a Replay

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