JTree, como adicionar Novos Icones

Olá Galera,
Estou criando uma JTree Com a seguinte Estrutura, que representa um Rede:

[Rede] [Grupo 01] -Maquina -Maquina -Maquina -Maquina [/Grupo 01] [Grupo 02] -Maquina -Maquina [/Grupo 02] [/Rede]

Mas Eu preciso que cada Item Tivesse um icone específico
E cada Maquina tivesse as opções de icones como Online e Offline e Custon (Para servidor, etc…)

Eu queria saber sé é possivel fazer isso !
Alguem tem algum demo que faça isso ?!

Você tem um TreeModel próprio para seu JTree?

Se tiver, provavelmente cada Node seu estará associado a uma classe diferente.

Então, basta criar um TreeCellRenderer com um Map que associe a classe do nó ao novo ícone. Eu já até postei isso aqui no GUJ:
http://www.guj.com.br/posts/list/50371.java#264652

No caso da classe ser da máquina, você ainda pode fazer um cast e associar um ícone ao enum do estado da máquina (online, offline e custom).

Sim, na classe Rede tem um a função para gerar o TreeModel.

E tem tem uma função que gera a hierarquia dessa classe de acordo com os grupos/maquinas que estão adicionados nela.
Só que essa hierarquia é formadar por Objects apartir de Strings.

Eu queria saber se é legal ( se n há problemas de memoria e tal) formar essa hierarquia aparitir dos Objetos das repectivas Classes:[rede][gupo][maquina]

Ai eu poderia fazer o cast da Maquina é pegar o estado dela, como vc disse…

O exemplo da Hierarquina é:

[Rede] Rede[0] - nome da Rede [GrupoA] GrupoA[0] - nome do gropo GrupoA[1] - nome da maquina GrupoA[2] - nome da maquina GrupoA[n] - nome da maquina [GrupoB] GrupoB[0] - nome do gropo GrupoB[1] - nome da maquina GrupoB[2] - nome da maquina GrupoB[n] - nome da maquina

Pq se eu fosse gerar os Nodes apartir da propria classe, irir ficar em cada elemento [0] dos Arrays, uma Classe com todas subclasses(elementos) sem precisão nenhuma…

Isso seria interessante pra min pois ao selecinar um node [Grupo] seria pra Exibir um “Relatorio” sobre aquele grupo. Mas minha preocupação é no caso da memoria e desenpenho

Se estiver errado me corrija…,
Se tiverem mais dicas eu agradeço…

Eu acho muito legal formar os nós de objetos da sua classe diretamente. Em termos de memória pode ser um pouco mais caro, mas você tem um ganho significativo de desempenho e de simplicidade em seu código.

De desempenho porque a informação já estará lá, disponível para uso. De simplicidade pois você não terá que fazer parse de Strings ou criação de classes usando reflexão.

Na pior das hipóteses, se estiver consumindo muita memória, você pode ainda procurar estruturar o seu TreeModel para fazer lazy loading dos grupos (basicamente as próprias classes de negócio podem fazer isso, já que a tree só requisita dados quando vai exibi-los). Não é muito complicado e você ainda mantém os benefícios acima.

Desculpe insistir no assunto, mas não consegui entender a sua resposta. Eu estava perguntando se você gera o seu próprio TreeModel, ao invés de usar o DefaultTreeModel. Eu recomendo fortemente que se faça isso, derive-se AbstractTreeModel e implemente-o com base em suas classes de negócio.

O código fica mais simples, modular e flexível.

Bem sobre o TreeModel eu estou gerando apartir do Default mesmo, pq ainda n descobri como se faz com o Abstract, ou melhor TreeModel.
Não consegui ver as vantagens, só iria ter mais trabalho :frowning:

Xiiiiii… Não sei o que é isso… :cry:

Eu ainda tenho varias duvidas sobre a questão de como o Java gerencia os Objetos, pq no pascal (que eu estava estudamdo antes) agente era quem tinha que gerenciar… :?

Mudei a estrutura do TreeNode/Model , como disse antes eu Usa um array Objeto[] da classe String agora eu uso as proprias Classes(Rede Grupo Maquina) para formar a hierarquia

Bem vou postar alguns trechos do meu “programa” para vcs me dizerem se tem alguma inconsistencia ou coisa que não é legal fazer:

A classe Maquina:

Basicamente é somente os Atributos e os Metodos set e gets para estes.
E o metodo:
      public String toString(){
        return this.getNome();
    }

Classe Grupo

public class GrupoMaq {
    private String Nome;
    private List MaquinasDoGrupo = new ArrayList();
{...}
/** Adiciona uma maquina no Grupo */ 
 public void addMaquina(Maquina maquina){
    // [!] Verificar se existe este maquina
    this.MaquinasDoGrupo.add(maquina);
}
    /**
     * Retorna um array Object[] contendo a hierarquia desse grupo <br>
     * O primeiro elemento dessa array é o <b>nome do grupo</b><br>
     * Os outros elementos tipo <b>Object</b> com o nome da maquina.
     */ 
    public Object[] getHierarquia(){
        List lista = this.getMaquinas();
        Maquina itemAtual;
        Object[] hierarquia = new Object[lista.size()+1];
        hierarquia[0] = this; // O elemento [0] é a propria Classe
        
        for (int i = 1; i &lt hierarquia.length; i++) {
            itemAtual = (Maquina) lista.get(i-1);
            hierarquia[i] = itemAtual; // Adicionar Maquinas
        }
        return hierarquia;
    }
    
    @Override
    public String toString(){
        return this.getNome();
    }

Na classe Rede

public class RedeMaq {
    private String Nome;
    private List GruposDaRede = new ArrayList();

{...}

    /** Adiciona um novo grupo na Rede */ 
    public void addGrupo(GrupoMaq novoGrupo){
        // [!] Verificar se existe este grupo na REDE
        this.GruposDaRede.add(novoGrupo);
    }
    
     /**
     * Retorna um array <b>Object[]</b> contendo a hierarquia desse Rede <br>
     * O primeiro elemento dessa array é o <b>Nome do Rede</b><br>
     * Os outros elementos são outros arrays <b>Object[]</b> contendo a <br>
     * hierarquina de cada Grupo que foi adicionado a essa Rede.
     */     
    public Object[] getHierarquia(){
        List lista = this.getGrupos();
        GrupoMaq itemAtual;
        Object[] hierarquia = new Object[lista.size()+1];
        hierarquia[0] = this;
        for (int i = 1; i &lt hierarquia.length; i++) {
            itemAtual = (GrupoMaq) lista.get(i-1);
            hierarquia[i] = itemAtual.getHierarquia();
        }
        return hierarquia;
    }
    
     /**
     * Gera um DefaultMutableTreeNode, que é um componente básico para se <br>
     * crir um <b>TreeModel</b> de um <b>JTree</b>
     */ 
    public DefaultMutableTreeNode getTreeNode(Object[] hierarquia){
        DefaultMutableTreeNode pai = new DefaultMutableTreeNode(hierarquia[0]);
        DefaultMutableTreeNode filha;
        for (int i = 1; i &lt hierarquia.length; i++) {
            Object objAtual = hierarquia[i];
            if (objAtual instanceof Object[])
                filha = getTreeNode((Object[]) objAtual);
            else 
                filha = new DefaultMutableTreeNode(objAtual);
            pai.add(filha);
        }
        return  pai;
    }

    /**
     * Gera um <b>TreeModel</b> apartir da Estrutura que a instancia dessa<br>
     * contem, apartir dai é so setar esse modelo no <b>JTree</b> e pronto !
     */   
    public DefaultTreeModel getTreeModel(){
        Object[] hierarquia = getHierarquia();
        return new DefaultTreeModel(this.getTreeNode(hierarquia));
    }
    
     @Override
    public String toString(){
        return this.getNome();
    }

Estou pensando em colocar outra função na Classe Grupo que gera um TableModel para quando eu Selecionar um grupo no JTree aparecer uma tabela com as Maquinas…
{…}

No momento o que eu fiz foi um Componente NetIco (que extende um Jlabel) e o contructor dele rebe uma Maquina como argumento e dela tirar as informações para se formar o a visualização (Icone)… , Se eu por acaso ao inves de Só pegar as informações da Maquina eu “copiasse” ela em algum atributo do NetIco, para que quando eu clicar em um Icone aparecer todas as informações da maquina…

A duvida sobre essa bagunça de ideias acima:
Quando eu crio um Metodo que recebe um Objeto qualquer o que ele faz é “copiar” ou ele só mantem a “referencia” ?!
Se eu alterar esse objeto dentro do Metodo essas alterações se refletem fora do metodo !?

Se eu quisse só manter a referencia (o que eu acho que é o caso), como faze ?!
Mas se eu quissesse um cópoia como eu a faria ?!

Quando por Exemplo faço isso:
JTable tableB = tableA; // a tableA foi criada em outro ponto.
Isso faz com que tableB sejá só uma referencia para tableA ?!

[color=red]Desculpem pela quantidade de perguntas(idiotas eu creio) mas essas questões tão me tirando a paciencia… :evil:[/color]
Quem puder responder ou me dar dicas sobre qualquer ponto agradeço !
vlw

[quote=RicardoCobain]Bem sobre o TreeModel eu estou gerando apartir do Default mesmo, pq ainda n descobri como se faz com o Abstract, ou melhor TreeModel.
Não consegui ver as vantagens, só iria ter mais trabalho :frowning: [/quote]

Bom, tire isso da cabeça. Você vai ter as seguintes vantagens:

  1. MENOS trabalho;
  2. Mais controle sobre a estrutura da sua JTree;
  3. Código consideravelmente mais claro;
  4. Separação da lógica de negócios da sua view.

Eu também já postei aqui no GUJ esse Model que facilita um bocado as coisas.

[quote=RicardoCobain]você pode ainda procurar estruturar o seu TreeModel para fazer lazy loading dos grupos
Xiiiiii… Não sei o que é isso… :cry:[/quote]

Lazy loading é o seguinte. Ao invés da classe grupo processar a lista de máquinas num construtor, faça o processamento ocorrer apenas quando a lista é solicitada. Basicamente é algo do tipo:

[code]public class GrupoDeMaquinas {
public Array<Maquinas> maquinas;
// … aqui iriam outras propriedades

public GrupoDeMaquinas(String nome) {
this.nome = nome;
this.maquinas = null;
}

public List<Maquinas> getMaquinas() {
if (maquinas == null) // a lista nunca foi solicitada?
this.maquinas = recuperaLista(); //Processa para obter a lista
return lista;
}
//… resto da classe aqui
}[/code]

Com isso, quando a sua árvore for montada a primeira vez, apenas com nós “collapsed”, ela não terá carregado nenhuma máquina na lista e, portanto, ocupará pouca memória. Cada nó expandido vai carregando as máquinas da lista e aumentando a quantidade de memória exigida pelo JTree. É uma técnica muito comum. Note que também pode haver uma pequena demora para abrir o nó a primeira vez.

O java cria os objetos no new e deleta os objetos em algum momento após eles não terem nenhuma referência. Não é necessário deletar o objeto manualmente em nenhum ponto do código, o que por sinal é ótimo. O java ainda é capaz de identificar “ilhas”, fazendo a exclusão do mesmo jeito (objeto A que referencia B, B que referencia A, mas ninguém referencia A ou B)

Você veio do pascal ou do Delphi?

Do Turbo Pascal, mais especificamente…
Ohhhh desgra** … hhehe

Beleza vou tentar fazer do jeito que você me indicou, usando omodelo Abstrato

E já enendi, então o lance é o uso ou não do NEW para se criar ou só referenciar um Objeto, legal…

Cara valeu mesmo pela ajuda… Qualquer coisa !!!