Ir para conteúdo
Fórum CódigoFonte.net

Marcos Arantes Júnior

Membros
  • Total de itens

    2
  • Registro em

  • Última visita

  1. Eu queria consultar pelo nó digitado. Ele ia procurar o nó pai e filhos que tem esse nome e se achar ele seleciona. Eu estava tentando criar um código sem pesquisar na internet mesmo. Eu consegui por parte apenas. Vou postar abaixo. // Verifica se existe o nó com o nome especificado for (int row = 1; row <= jTree1.getRowCount(); row++) { if (jTree1.getPathForRow(row).toString().substring(9).replace("]", "").equals(txtDescricao.getText().trim())) { // Seleciona o nó com base no índice caso encontre o nó especificado jTree1.setSelectionRow(row); lblMensagem.setText("Encontrado: " + jTree1.getPathForRow(row).toString().substring(9).replace("]", "")); } else { lblMensagem.setText("Não encontrado"); } } Só esse loop que deve estar com problema, porque percebi que tem índices que não tem número deles no especificado. O problema também e que jTree1.getRowCount() não deve estar dando certo porque, no meu exemplo, ele retorna 5 no total, mas tem índices com 7 e 9. Ele teria que percorrer pelos índices corretos. Esse código esta dando erro.
  2. 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.
×
×
  • Criar Novo...