2010-03-10 4 views
3

Как я могу реализовать динамический Jtree, который показывает созданные экземпляры кланов?JTree объектов?

Например, я могу создать новую книгу (имя) в своем приложении. В каждой книге могут быть главы = ArrayList of Chapter. И теперь, как я могу сделать из него jtree?

ответ

2

класс участвует в JTree использования является следующим:

  • самого JTree класс, который обеспечивает отображаемый нужные вам пункт, и он работает точно так же, как таблицы и списки в колебании: у них есть модель!
  • DefaultTableModel implements TableModel, который работает как контейнер данных для JTree. Он связан с корневым узлом, затем каждый ребенок добавляется к корневому узлу или к другим узлам, содержащимся в дереве.
  • DefaultMutableTreeNode, который является реализацией по умолчанию общего назначения для общего узла JTree.

Как смешивать эти вещи? Прежде всего, я предлагаю вам проверить Java руководство солнца об этом here но иметь быстрый взгляд вы можете думать о том, что-то вроде этого:

// 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 

подход действительно идентичен тому, который вы используете для JTable или JList также если структура данных (и так модель) отличается. Подумайте, что это по умолчанию способ сделать это, но вы можете легко написать свой собственный TreeNode или TreeModel класс в соответствии с тем, что вам действительно нужно.

Я хотел бы сообщить вам, что руководство по солнцу о java содержит почти каждую тему, содержащуюся в базовом JDK, так что это хорошая вещь, чтобы придать ей вид, прежде чем почувствовать себя потерянным.

0

Вы также можете реализовать свою собственную модель, вот он идет один я сделал для группы и групп пользователей:

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; 
    } 

} 
Смежные вопросы