Tree Table

Galera,

Alguém poderia me explicar como se implementa uma Tree dentro de uma Table. Tentei seguir o tuto desse link http://java.sun.com/docs/books/tutorial/uiswing/components/table.html, mas não obtive sucesso.

Valeu! :wink:

existe um componente no projeto swinglabs, vc poderia tentar usa-lo é bem mais facil.

um exemplo segue aqui:

package swingx.sample;
 
import org.jdesktop.swingx.treetable.DefaultTreeTableModel;
 
public class FamilyTreeTableModel extends DefaultTreeTableModel {
    
    
    public FamilyTreeTableModel(People p) {
        super(p);
    }
 
    public int getColumnCount() {
        return 2;
    }
    
    public String getColumnName(int column) {
        return (column == 0 ? "Name" : "Age");
    }
    
    public boolean isCellEditable(Object node, int column) {
        return false;
    }
    public Object getValueAt(Object node, int column) {
        
        People p = (People) node;
        
        String value = p.getName();
        
        if (column == 1)
            value = p.getAge()+"";
        
        return value;
    }
    
}


package swingx.sample;
 
import java.util.ArrayList;
import java.util.List;
 
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
 
public class People extends DefaultMutableTreeNode {
    
    private static final long serialVersionUID = 1L;
    
    People parent = null;
    List<People> childs = new ArrayList<People>();
    
    private int age;
    private String name;
    
    public People(String nome, int idade) {
        setName(nome);
        setAge(idade);                
    }    
    public void setParent(People p) {
        this.parent = p;
    }
    public List<People> getChilds() {
        return childs;
    }
    public void setChilds(List<People> filhos) {
        this.childs = filhos;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int idade) {
        this.age = idade;
    }
    public String getName() {
        return name;
    }
    public void setName(String nome) {
        this.name = nome;
    }       
    public void add(People p) {        
        childs.add(p);
        p.setParent(this);
    }
    
    public TreeNode getChildAt(int childIndex) {
        return childs.get(childIndex);
    }
    
    public int getChildCount() {
        return childs.size();
    }
    
    public TreeNode getParent() {
        return parent;
    }
    public int getIndex(TreeNode node) {
        return childs.indexOf(node);
    }
    
    public boolean equals(Object p) {
        
        if (p == null || !(p instanceof People))
            return false;
        
        People p2 = (People) p;
        
        if (p2.getName().equalsIgnoreCase(this.getName()))
            return true;
        
        return false;
    }
    
    public String toString() {
        return getName();
    }
    
}


package swingx.sample;
 
import java.awt.BorderLayout;
import java.awt.Dimension;
 
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeModel;
 
import org.jdesktop.swingx.JXTreeTable;
 
public class MainPeople {
 
 
    public static void main(String[] args) {
        People alex = new People("Alex",23);
        
        People alex2 = new People("Alex 2 ",3);
        People alex3 = new People("Alex 4 ",5);
        
        alex2.add(alex3);
        alex.add(alex2);
        
        createGUI(alex);
    }
 
    private static void createGUI(People p) {
        
        JFrame frame = new JFrame("Test JXTableTree by Alex");
                
        frame.setSize(350, 200);
        
        frame.setLocationRelativeTo(null);
        
        frame.setLayout(new BorderLayout());
        
        
        JXTreeTable tree = treeTable(p);
        JTree tree2 = convetionalTree(p);
        
        
        JScrollPane s1 = new JScrollPane(tree);
        JScrollPane s2 = new JScrollPane(tree2);
        
        s1.setPreferredSize(new Dimension(150, 100));
        s2.setPreferredSize(new Dimension(150, 100));
        
        frame.add(s1, BorderLayout.EAST);                
        frame.add(s2, BorderLayout.WEST);
        
        
        frame.setVisible(true);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
    }
 
    private static JXTreeTable treeTable(People p) {
        JXTreeTable tree = new JXTreeTable(new FamilyTreeTableModel(p));
        return tree;
    }
 
    private static JTree convetionalTree(People p) {
        JTree tree = new JTree(new DefaultTreeModel(p));
         tree.setRootVisible(true);
        return tree;
    }
 
}

Testei aqui e deu certo! Muito obrigado ualex !!!

Boa tarde pessoal, estou seguindo o mesmo tutorial que o amigo BrunoLeonardo citou, implementei meu model extendendo o AbstractTreeTableModel, esta montando a jtreetable perfeitamente, mas estou com dois problemas que não estou conseguindo resolver.

1º. Tornar as celulas editaveis: sobrescrevi o metodo

public boolean isCellEditable(Object node, int column) para a minha regra de negocio, blz, esta funcionando ele permite que a celula seja ou não editavel de acordo com a minha regra, mas quando edito o valor e saiu da celula o novo valor informado simplismente desaparece voltando ao valor que estava setado anteriormente ao componente.

2º. Chamar método quando a celula for editada: preciso disto pois o usuario irá informar um novo valor para a celula e eu preciso utilizar este valor para atualizar o restante da jtreetable, mas não encontrei como registrar um listener para isso.

Qualquer ajuda é muito bem vinda.

Grato a todos!

[]'s