Ir para conteúdo
Fórum Script Brasil
  • 0

jTree com 2 tabelas


Marcos Arantes Júnior

Pergunta

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.

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...