JTreeModel

Résolu
emilien81 Messages postés 21 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 2 juin 2005 - 1 juin 2005 à 12:45
emilien81 Messages postés 21 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 2 juin 2005 - 2 juin 2005 à 09:23
Bonjour a tous,

J'ai un probleme avec un arbre de type JTree en Java. En fait j'ai des blancs qui apparaissent et lorsque je veux ajouter un noeud à l'arborescence, il faut que je rafraichisse tout l'arbre pour qu'il le prenne en compte.
Le soucis c'est que je ne sais pas par ou commencer par prendre mon probleme.

je crois que le plus simple c d'abord de vous montrer des bouts du code :

//entete de la classe + constructeur
public class ArbreModel implements TreeModel, Observer
{
private Root root= null;
private ArrayList listener = new ArrayList();

public ArbreModel(Root _root)
{
this.root=_root;

rootChanged();
this.reseau.addObserver(this);
}

________________________

//l'ajout d'un noeud
public void nodeAdded(TreeElement node)
{
node.addObserver(this);
TreePath path = node.getParent().makeTreePath();
int childIndex[] = {node.getParent().getIndexOfChild(node)};
Object nodes[] = {node};

//averti de l'ajout d'un noeud
TreeModelEvent event = new TreeModelEvent(this, path, childIndex, nodes);
for (int i=this.listener.size()-1; i>=0; i--)
{
TreeModelListener l = (TreeModelListener) this.listener.get(i);
l.treeNodesInserted(event);
}
}

ce que j'ai remarqué c'est que si je retire le addObserver dans le constructeurou encore si je met TreePath path node.makeTreePath(); à la place de TreePath path node.getParent().makeTreePath(); dans l'ajout d'un noeud
alors les blancs disparaissent mais par contre si je veux ajouter un noeud ensuite il faut que je rafraichisse tout l'arbre pour voir apparaitre cet ajout.

je ne sais vraiment pas comment debuguer ca, si quelqu'un a une idée pour me sortir de la je suis preneur.
Merci

Emilien

7 réponses

emilien81 Messages postés 21 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 2 juin 2005
2 juin 2005 à 09:23
voila le code que j'ai mis en place:

public class ArbreExpandListener implements TreeWillExpandListener
{
private ArrayList listeNoeudOuvert = new ArrayList();
private boolean saveExpandListener = true;
private JTree tree = null;
private static ArbreExpandListener arbreListener = null;

public ArbreExpandListener()
{
}

public static ArbreExpandListener getInstance()
{
if (arbreListener==null)
{
arbreListener = new ArbreExpandListener();
}

return arbreListener;
}

public void treeWillExpand(TreeExpansionEvent evt) throws ExpandVetoException
{
if (this.saveExpandListener==true)
{
this.tree = (JTree)evt.getSource();
TreePath path = evt.getPath();

this.listeNoeudOuvert.add(path);
}
}

public void treeWillCollapse(TreeExpansionEvent evt) throws ExpandVetoException
{
if (this.saveExpandListener==true)
{
this.tree = (JTree)evt.getSource();
TreePath path = evt.getPath();
TreeElement elt = (TreeElement) path.getLastPathComponent();
for (int i=0; i<elt.getChildCount(); i++)
{
TreePath pathChild= ((TreeElement) elt.getChild(i)).makeTreePath();
if (this.tree.isExpanded(pathChild))
{
this.tree.collapsePath(pathChild);
}
}

this.listeNoeudOuvert.remove(path);
}
}

public void blockSaveExpandListener()
{
this.saveExpandListener = false;
}

public void unblockSaveExpandListener()
{
this.saveExpandListener = true;
}

public void reExpandAllExpandedNodes()
{
if (this.tree!=null)
{
for (int i=0; i<this.listeNoeudOuvert.size(); i++)
{
this.tree.expandPath((TreePath) this.listeNoeudOuvert.get(i));
}
}
}
}
3
cs_mep Messages postés 86 Date d'inscription vendredi 7 mai 2004 Statut Membre Dernière intervention 3 septembre 2008 4
1 juin 2005 à 13:01
Deja pou eviter de reloader tout l'arbre tu peux te contenter de
reloader le parent du noeud que tu ajoute. Si ton parent est le root ca
revient au meme que de reloader tout l'arbre.
0
emilien81 Messages postés 21 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 2 juin 2005
1 juin 2005 à 13:04
en fait je le fais deja mais c'etait pour simplifier l'explication
mais le soucis de reloader c que ca referme tous les noeuds qui sont ouvert
0
cs_mep Messages postés 86 Date d'inscription vendredi 7 mai 2004 Statut Membre Dernière intervention 3 septembre 2008 4
1 juin 2005 à 14:01
Ba essai de faire une fonction que sauvegarde le depliage/repliage de chaque noeud avant l'ajout et qui le reproduit apres.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
emilien81 Messages postés 21 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 2 juin 2005
1 juin 2005 à 14:31
j'y avais pensé mais ca risque de ralentir le temps d'execution de l'apllication
et je sais que c possible de le faire sans.
ca serait dommange de faire comme ca, alors que Java est assez bien fait pour gérer ce type d'evenement.
0
cs_mep Messages postés 86 Date d'inscription vendredi 7 mai 2004 Statut Membre Dernière intervention 3 septembre 2008 4
1 juin 2005 à 14:42
Pour optimiser tu peux partir du noeud parent pour sauver les etats. Sinon je ne vois pas d'autre solution ...
0
emilien81 Messages postés 21 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 2 juin 2005
1 juin 2005 à 15:17
merci, je vais surement faire ca en attendant de trouver mieux
0
Rejoignez-nous