2009-06-19 9 views
1

Cette méthode fonctionne comme prévu - il crée un JTree avec un nœud racine et deux enfants conteneur noeuds (chacun avec un nœud feuille respective):Java Swing JTree Expansion

private JComponent createSideBar() 
{ 
    final DefaultMutableTreeNode top = new DefaultMutableTreeNode("Projects"); 
    final JTree tree = new JTree(top); 

    DefaultMutableTreeNode project = new DefaultMutableTreeNode("project 1"); 
    DefaultMutableTreeNode version = new DefaultMutableTreeNode("version 1"); 
    project.add(version); 
    top.add(project); 
    TreePath treePath = new TreePath(project.getPath()); 
    // tree.expandPath(treePath); 

    project = new DefaultMutableTreeNode("project 2"); 
    version = new DefaultMutableTreeNode("version 2"); 
    project.add(version); 
    top.add(project); 

    return tree; 
} 

Dans ce cas, l'arbre commence dehors fermé. Je voudrais l'application de commencer par tous les noeuds I sont entièrement développés alors commencé en ajoutant ce qui suit:

tree.expandPath(treePath); 

mais quand je Décommentez depuis le code ci-dessus, le second jeu de nœuds enfants ne montrent pas en haut, à savoir: le projet 2 et la version 2 n'apparaissent pas. En fait, tous les nœuds ajoutés par la suite n'apparaissent jamais.

Pour ce que ça vaut, j'utilise JDK 1.5. De la docs, je ne peux pas voir de restrictions ou pourquoi cette méthode aurait de tels effets négatifs ... Je vais essayer de regarder la source, mais j'espérais que quelqu'un pourrait avoir une bonne idée de quoi et pourquoi est le comportement attendu. Je me demande si chaque nœud suivant 'add' est en quelque sorte interdit - mais je ne peux pas imaginer que cela fonctionnerait pour la plupart des cas d'utilisation.

Merci,

-Luther

Répondre

2

Malheureusement, Swing est souvent "utile". Dans ce cas, il crée un modèle pour vous à partir des données fournies, à peu près la même chose qu'un JList créerait un modèle si vous fournissiez un Vector.

JTree et les complices (principalement le Pluggable Look & Feel) ajouteront des écouteurs au modèle pour se tenir au courant des mises à jour. Si vous changez simplement les données derrière le dos (implicite), rien ne sera mis à jour autrement que par hasard. Donc, ce que vous devriez faire est de créer explicitement un modèle. Lorsque les données du modèle changent (toujours sur l'EDT, bien sûr), provoquent le déclenchement de l'événement concerné.

+0

+1, je ne le savais pas. –

1

Si les nœuds sont ajoutés à un noeud qui a déjà été développé, vous devez reload the model.

((DefaultTreeModel)tree.getModel()).reload(); 

ou

((DefaultTreeModel)tree.getModel()).reload(top); 

Cette second version est plus utile si vous voulez recharger seulement une petite partie d'un grand arbre.

0

Ah ... le modèle. Vos réponses sont élaborées sur un bit here et here .... et même here.

je fini par faire quelque chose comme:

DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); 
model.insertNodeInto(newNode, parent, index); 

qui maintient le modèle directement informé. Dans mon cas, ça va bien.

Maintenant, comment marquer l'un d'entre eux comme la réponse!?!