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