2010-03-10 4 views
3

Comment je peux implémenter dynamique Jtree, qui montre des instances créées de clases?JTrois objets?

Par exemple, je peux créer un nouveau livre (nom) dans mon application. Dans chaque livre peut être chapitres = ArrayList of Chapter. Et maintenant comment je peux en faire un jtree?

Répondre

2

classe impliquée dans l'utilisation DTree sont les suivantes:

  • la classe elle-même JTree qui fournit l'élément affichable dont vous avez besoin et il fonctionne exactement comme les tables et listes Swing: ils ont un modèle!
  • le DefaultTableModel implements TableModel qui fonctionne comme un conteneur de données pour un JTree. Il est istancé avec un nœud racine, puis tous les enfants sont ajoutés au nœud racine ou aux autres nœuds contenus dans l'arbre.
  • le DefaultMutableTreeNode qui est une implémentation par défaut à usage général pour un nœud JTree générique.

Comment mélanger ces choses? Tout d'abord, je vous suggère de vérifier guide soleil java à ce sujet here mais d'avoir un rapide coup d'oeil, vous pouvez penser à avoir quelque chose comme ceci:

// this is the root of your tree 
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Books"); 

for (Book b : books) 
{ 
    // this adds every book to the root node 
    DefaultMutableTreeNode curBook = new DefaultMutableTreeNode(b); 

    root.add(curBook); 

    // this adds every chapter to its own book 
    for (Chapter c : b.chapters()) 
    curBook.add(new DefaultMutableTreeNode(c)); 
} 

// at this point you have your tree ready, you just have to setup the model and create the effective JTree 

DefaultTreeModel treeModel = new DefaultTreeModel(root); 
JTree tree = new JTree(treeModel); 

//now you tree is ready to be used 

approche est vraiment identique à celui que vous utilisez pour JTable ou JList aussi si la structure de données (et donc le modèle) diffère. Pensez-y que c'est la par défaut façon de le faire mais vous pouvez facilement écrire votre propre classe TreeNode ou TreeModel selon ce dont vous avez vraiment besoin. Je voudrais vous faire savoir que le guide du soleil sur java contient presque tous les sujets contenus dans le JDK de base, donc c'est une bonne chose de le regarder avant de se sentir perdu.

0

Vous pouvez également implémenter votre propre modèle, ici, il va que je fait pour le groupe et un groupe d'utilisateurs:

public class GrupoUserTreeModel implements TreeModel 
{ 
    private String raiz; 
    private ArrayList<Grupo> grupos = new ArrayList<Grupo>(); 
    private List<TreeModelListener> listeners = new ArrayList<TreeModelListener>(); 

    public GrupoUserTreeModel(String raiz) 
    { 
     this.raiz = raiz; 
    } 

    public Object getRoot() 
    { 
     return raiz; 
    } 

    private void fireTreeStructureChanged() 
    { 
     Object[] o = {raiz}; 
     TreeModelEvent e = new TreeModelEvent(this, o); 
     for(TreeModelListener l : listeners) 
      l.treeStructureChanged(e); 
    } 

    public void addGrupo(Grupo grupo) 
    { 
     grupos.add(grupo); 
     fireTreeStructureChanged(); 
    } 

    public void addUsuario(Grupo grupo, Usuario usuario) 
    { 
     Grupo g = grupos.get(grupos.indexOf(grupo)); 
     g.getUsuarios().add(usuario); 
     TreePath p = new TreePath(new Object[]{g}); 
     this.fireTreeStructureChanged(); 
    } 

    public void limpar() 
    { 
     grupos.clear(); 
     this.fireTreeStructureChanged(); 
    } 

    public void removeGrupo(Grupo grupo) 
    { 
     if(!grupos.remove(grupo)) 
      throw new NullPointerException("Grupo: "+grupo+" inexistente na Tree"); 
     this.fireTreeStructureChanged(); 
    } 

    public ArrayList<Grupo> getGrupos() 
    { 
     return this.grupos; 
    } 

    public void setGrupos(ArrayList<Grupo> grupos) 
    { 
     this.grupos = grupos; 
     this.fireTreeStructureChanged(); 
    } 

    public ArrayList<Usuario> getUsuarios(Grupo grupo) 
    { 
     Grupo g = grupos.get(grupos.indexOf(grupo)); 
     return g.getUsuarios(); 
    } 

    public void removeUsuario(Grupo grupo, Usuario usuario) 
    { 
     Grupo g = grupos.get(grupos.indexOf(grupo)); 
     if(!(g.getUsuarios()).remove(usuario)) 
      throw new NullPointerException("Usuário: "+usuario+" inexistente no Grupo: "+ 
        grupo+" na Tree"); 
     TreePath p = new TreePath(new Object[]{g}); 
     this.fireTreeStructureChanged(); 
    } 

    public Object getChild(Object parent, int index) 
    { 
     if(parent == raiz) 
     { 
      return grupos.get(index); 
     } 
     if(parent instanceof Grupo) 
     { 
      Grupo g = grupos.get(grupos.indexOf(parent)); 
      return g.getUsuarios().get(index); 
     } 
     throw new IllegalArgumentException("Parent não é de um tipo suportado pela Tree"); 
    } 

    public int getChildCount(Object parent) 
    { 
     if(parent == raiz) 
      return grupos.size(); 
     if(parent instanceof Grupo) 
     { 
      Grupo g = grupos.get(grupos.indexOf(parent)); 
      return g.getUsuarios().size(); 
     } 
     throw new IllegalArgumentException("Parent não é de um tipo suportado pela Tree"); 
    } 

    public boolean isLeaf(Object node) 
    { 
     return node instanceof Usuario; 
    } 

    public void valueForPathChanged(TreePath path, Object newValue) 
    { 

    } 

    public int getIndexOfChild(Object parent, Object child) 
    { 
     if(parent == raiz) 
      return grupos.indexOf(child); 
     if(parent instanceof Grupo) 
      return grupos.get(grupos.indexOf(child)).getUsuarios().size(); 
     return 0; 
    } 

    public void addTreeModelListener(TreeModelListener l) 
    { 
     listeners.add(l); 
    } 

    public void removeTreeModelListener(TreeModelListener l) 
    { 
     listeners.remove(l); 
    } 

} 

public class Grupo 
{ 
    private ArrayList<Usuario> usuarios = new ArrayList<Usuario>(); 
    private String nome; 

    public Grupo(String nome) 
    { 
     this.nome = nome; 
    } 

    /** 
    * @return the usuarios 
    */ 
    public ArrayList<Usuario> getUsuarios() { 
     return usuarios; 
    } 

    /** 
    * @param usuarios the usuarios to set 
    */ 
    public void setUsuarios(ArrayList<Usuario> usuarios) { 
     this.usuarios = usuarios; 
    } 

    /** 
    * @return the nome 
    */ 
    public String getNome() { 
     return nome; 
    } 

    /** 
    * @param nome the nome to set 
    */ 
    public void setNome(String nome) { 
     this.nome = nome; 
    } 

    public String toString() 
    { 
     return this.nome; 
    } 

    public boolean equals(Object outro) 
    { 
     if(outro instanceof Grupo) 
     { 
      Grupo o = (Grupo) outro; 
      return o.getNome().equals(this.getNome()); 
     } 
     return false; 
    } 
} 

public class Usuario 
{ 
    private String nome; 

    public Usuario(String nome) 
    { 
     this.nome = nome; 
    } 

    /** 
    * @return the nome 
    */ 
    public String getNome() { 
     return nome; 
    } 

    /** 
    * @param nome the nome to set 
    */ 
    public void setNome(String nome) { 
     this.nome = nome; 
    } 

    public String toString() 
    { 
     return this.nome; 
    } 

    public boolean equals(Object outro) 
    { 
     if(outro instanceof Usuario) 
     { 
      Usuario o = (Usuario) outro; 
      return o.getNome().equals(this.getNome()); 
     } 
     return false; 
    } 

}