jTree com 2 tabelas

11/11/2010

0

Gostaria de carregar o jTree da seguinte maneira: Tenho 2 tabelas: grupos e info. Na tabela grupos te os campos codigo e grupo. Na tabela info tem os campos grupos_codigo, titulo, descricao.
Os nós pai seriam os grupos cadastrados e os nós filhos seriam os título cadastrados que estão nesse grupo.
Tenho as classes abaixo e queria mudar para o que eu quero. Já tentei fazer, mas não deu certo. Dá pra ver que tem que instanciar cada classe que vai ser o nó pai. Como eu faria isso para ter os nós pai de acordo com cada registro de grupos e em cada grupo(nó pai), tem seus respectivos filhos, que possuem esse código do grupo(chave estrangeira). Segue as classes exemplo abaixo, lembrando que ainda não mudei as classes para os nomes dados às tabelas porque estava testando o código e do jeito que preciso não funcionou.
Classes:
public class Autor {
    private String nome;

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

    public String getNome() {
        return nome;
    }

    @Override
    public String toString() {
        return getNome();
    }
}


Classe livro
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Livro {
    private String nome;
    private List<Autor> autores = new ArrayList<Autor>();

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

    public String getNome() {
        return nome;
    }

    @Override
    public String toString() {
        return getNome();
    }

    public void addAutor(Autor autor) {
        autores.add(autor);
    }

    public List<Autor> getAutores() {
        return Collections.unmodifiableList(autores);
    }
}

TreeModel Implementado
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

public class LivroTreeModel implements TreeModel {
        //Criamos um objeto para nossa raiz. O List não pode ser usado diretamente pois
        //seu hash irá mudar sempre que um novo livro for adicionado.
        //Fora que é mais bonitinho escrever "Livros" no topo.
        private String raiz = "Livros";

    // Escrevam depois AbstractTreeModel para lidar com os listeners.
    private List<TreeModelListener> listeners = new ArrayList<TreeModelListener>();

    // Raiz da nossa árvore, vamos exibir uma lista de livros.
    private List<Livro> livros;

    public LivroTreeModel(List<Livro> livros) {
        this.livros = livros;
    }

    /**
     * Com esse método, o Java quem é o objeto que está num determinado índice
     * do pai. Cada nó de uma árvore pode ser encarado como uma lista. Sendo o
     * pai a lista e o índice um dos filhos.
     * 
     * @param parent
     *            É o pai, que tem os filhos. No caso do Livro, o próprio livro.
     * @param index
     *            Índice do filho. No caso do livro, o índice corresponde aos
     *            autores.
     */
    public Object getChild(Object parent, int index) {
        if (parent == raiz) // É o nó principal?
            return livros.get(index); // Pegamos da lista de livro

        if (parent instanceof Livro) // O pai é um livro?
        {
            // Devolvemos um autor
            return ((Livro) parent).getAutores().get(index);
        }

        // Se o pai não é nenhum desses. Melhor dar erro.
        throw new IllegalArgumentException("Invalid parent class"
                + parent.getClass().getSimpleName());
    }

    /**
     * Retornamos quantos filhos um pai tem. No caso de um livro, é a contagem
     * de autores. No caso da lista de livros, é a quantidade de livros.
     */
    public int getChildCount(Object parent) {
        // Mesma lógica.
        if (parent == raiz)
            return livros.size();

        if (parent instanceof Livro) // O pai é um livro?
            return ((Livro) parent).getAutores().size();

        // Se o pai não é nenhum desses. Melhor dar erro.
        throw new IllegalArgumentException("Invalid parent class"
                + parent.getClass().getSimpleName());
    }

    /**
     * Dado um pai, indicamos qual é o índice do filho correspondente.
     */
    public int getIndexOfChild(Object parent, Object child) {
        if (parent == raiz)
            return livros.indexOf(child);
        if (parent instanceof Livro)
            return ((Livro) parent).getAutores().indexOf(child);

        return 0;
    }

    /**
     * Devemos retornar quem é o nó raiz da árvore. Afinal, a árvore tem que
     * começar em algum lugar.
     */
    public Object getRoot() {
        return raiz;
    }

    /**
     * Indicamos se um nó é ou não uma folha. Isso é, se ele não tem filhos. No
     * nosso caso, os autores são as folhas da árvore.
     */
    public boolean isLeaf(Object node) {
        return node instanceof Autor;
    }

    public void valueForPathChanged(TreePath path, Object newValue) {
        // Com esse método, a tree avisa que um objeto mudou.
        // Editem se quiserem que um nó seja editável
    }

    // Esses dois métodos abaixo poderiam ir para classe abstrata
    public void removeTreeModelListener(TreeModelListener l) {
        listeners.remove(l);
    }

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

Agora a tela principal usando o modelo com as classes
import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.TreeModel;

public class Tela extends JDialog {
    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JScrollPane scrlTree = null;
    private JTree treeLivros = null;
    private TreeModel treeModel;

    public Tela(TreeModel treeModel) {
        super();
        this.treeModel = treeModel;
        initialize();
    }

    private void initialize() {
        this.setSize(361, 240);
        this.setLocationRelativeTo(null);
        this.setTitle("Tree");
        this.setContentPane(getJContentPane());
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getScrlTree(), BorderLayout.CENTER);
        }
        return jContentPane;
    }

    private JScrollPane getScrlTree() {
        if (scrlTree == null) {
            scrlTree = new JScrollPane();
            scrlTree.setViewportView(getTreeLivros());
        }
        return scrlTree;
    }

    private JTree getTreeLivros() {
        if (treeLivros == null) {
            treeLivros = new JTree(treeModel);
            treeLivros.setRootVisible(false);
            treeLivros.setShowsRootHandles(true);
        }
        return treeLivros;
    }

    public static void main(String[] args) {
        List<Livro> livros = new ArrayList<Livro>();

        Livro livro = new Livro("Duna");
        livro.addAutor(new Autor("Frank Herbert"));
        livros.add(livro);

        Livro livro2 = new Livro("50 Anos Depois");
        livro2.addAutor(new Autor("Chico Xavier"));
        livro2.addAutor(new Autor("Emmanuel (Espírito)"));
        livros.add(livro2);

        Livro livro3 = new Livro("O rapto do garoto de ouro");
        livro3.addAutor(new Autor("Marcos Rey"));
        livros.add(livro3);

        Tela tela = new Tela(new LivroTreeModel(livros));
        tela.setVisible(true);
    }
} 


É só copiar e colar cada classe. Dá pra ver que o autor colocou um exemplo sem usar banco de dados e cada instância é um livro(nó pai) com seus autores(nó filho). Com banco de dados puxando de 2 tabelas não consegui fazer.
Teria que ficar assim: Tenho cadastrado dois grupos, mas poderia ter N grupos cadastrados. Registros da tabela grupo>>> grupo1, grupo2
Registros da tabela info(grupos_codigo,titulo,descricao)>>>1,titulo1,descricao1
2,titulo2,descricao2      1,titulo3,descricao 3    2,titulo4,descricao4

Na árvores ficaria assim:
grupo1
          titulo1,titulo3
grupo2
         titulo2,titulo4


Quando eu clicasse em um título, mostraria a descrição dele no jEditorPane. Quando eu cadastrasse mais grupos e titulos, a cada cadastro, a jTree deve ser atualizada. Espero que possam me ajudar porque já procurei muito e dessa maneira que quero ainda não consegui. Fiquei até a madrugada hoje, mas nada.
Marcos Júnior

Marcos Júnior

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar