[Resolvido] Propriedades/Manipulação de Jtree (Baseado no código Livros/Autores)

1 resposta
V

Olá,

Estou usando na minha aplicacao o codigo de Jtree postado pelo moderador ViniGodoy: http://www.guj.com.br/posts/list/200192.java#1009903
 Nesta aplicacao, a Jtree representa maquinas/softwares.
  Exemplo:

  Cidade
  --Maquina 1
  -----Software 1
  -----Software 2
  -----Software n
  --Maquina 2
  -----Software 1
  -----Software 2
  -----Software n
           .
           .
           .

   Consegui montar a arvore baseado nos dados de um banco de dados, onde alterei as Classes Livro e Autor por Maquinas e softwares respectivamente.
   O problema começa quando eu tenho que usar propriedades mais especificas da Jtree. Venho procurando a um tempo solucoes, porem as que encontro geram erro e nao consigo entender o porque. As funcionalidades que preciso implementar sao as seguintes:
   Ao iniciar a aplicacao preciso que a Jtree esteja com todos os nos expandidos. O codigo a seguir é para resolver esse problema, porém da erro:
.
   .
   .
  expandAll(treeLivros, true);
   .
   .
   .


 public void expandAll(JTree tree, boolean expand) {
     TreeNode root = (TreeNode)tree.getModel().getRoot();

     // Traverse tree from root
     expandAll(tree, new TreePath(root), expand);
 }
 private void expandAll(JTree tree, TreePath parent, boolean expand) {
     // Traverse children
     TreeNode node = (TreeNode)parent.getLastPathComponent();
     if (node.getChildCount() >= 0) {
         for (Enumeration e=node.children(); e.hasMoreElements(); ) {
             TreeNode n = (TreeNode)e.nextElement();
             TreePath path = parent.pathByAddingChild(n);
             expandAll(tree, path, expand);
         }
     }

     // Expansion or collapse must be done bottom-up
     if (expand) {
         tree.expandPath(parent);
     } else {
         tree.collapsePath(parent);
     }
 }

O erro gerado é “Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: java.lang.String cannot be cast to javax.swing.tree.TreeNode”

A excessao é gerada na linha:

TreeNode root = (TreeNode)tree.getModel().getRoot();

Apos te-la extendida, o que preciso é ao iniciar a aplicacao (se o usuario ativar esta acao) cada um dos nós (tanto maquina quanto softwares) sejam percorridos automaticamente, um a um (como se fosse um click do mouse) por determinados segundos, de modo que a cada selecao, eu atualize um Jpanel que fica ao lado da Jtree que contera dados de cada no selecionado.
Exemplo:

Maquina 1 (selected) —> Jpanel = dados da maquina 1
-----Software 1
-----Software 2

Passado alguns segundos…

Maquina 1
-----Software 1 (selected) —> Jpanel = dados do software 1
-----Software 2

E assim por diante.

Obrigado...

1 Resposta

V

Consegui resolver os problemas. Vou registrar aqui as soluções para que possa ajudar outros usuários.

Sobre a expansão dos nós, consegui resolver com o codigo a seguir:

public static void expandTree (JTree tree)
	{
		try {
			for(int row = 0; row <= tree.getRowCount(); row ++)
			{
				tree.expandRow(row);
			}
		} catch (Exception e) {
                //tratar erro
		}
	}

Sobre o problema de seleção automatica: Fiz uma thread que fica selecionando os nós e fiz criei uma classe filha de DefaultTreeCellRenderer para que quando um nó fosse selecionado, recebesse o evento no método getTreeCellRendererComponent. Neste método verificava quem estava selecionado (livro/ autor) e montava o panel de acordo com essa informação.

Criado 12 de julho de 2010
Ultima resposta 23 de ago. de 2010
Respostas 1
Participantes 1