Javafree
Página Inicial do Fórum > GUI - (Applets, Swing, SWT, etc)

reconstruir uma JTree



Criar novo tópico   Responder tópico


  1. sekkuar
    Posts:5998


    Comment Arrow

    Publicado em: 20/10/2011 11:27:34

    estou com um problema com JTree,

    eu preciso criar ela, a partir do banco de dados.

    Onde eu tenho uma tabela Grupo


    ou seja, um grupo pode ter vários subgrupos, e estes podem ter seus subgrupos.... e por ai vai.

    eu montei o modelo da JTree de forma recursiva, primeiro eu faço uma busca de todos os grupos sem a chave estrangeira, depois, para cada grupo retornado, eu pesquiso se ele é supergrupo, e repito para todos os subgrupos, até não retornar mais nada.


    Para montar a arvore da primeira vez, funciona, mas, eu quero que a árvore seja atualizada toda vez que a janela ganhar o focus, por isso, criei um WindowFocusListener, e mandei ele re-fazer a pesquisa e re-fazer o modelo da JTree.


    Teoricamente, todos os métodos chamados estão sendo executados, e, ele atualiza a JTree, mas apenas quando os dados não foram alterados,

    por exemplo, eu adiciono um novo grupo na tabela, da proxima vez que ele for atualizar, ele não desenha mais a árvore, ela fica cinza e nada aparece nela.

    aqui estão os códigos relevantes



    Da primeira vez ele preenche certo, se os dados não mudarem, ele preenche certo, mas, quando os dados mudam, a JTree não é desenhada mais, só se eu criar uma nova Tela.


    _________________

    Sekkuar ~ Ex-Catador Executivo do Javafree - (Não mais) Catando os tópico tudo.
    "The mod javafree deserves, but not the one it needs right now."

    Stack Traces existem pra ajudar e não para trazer uma mensagem de satã dizendo que seu computador será destruído.


    Peça seu Código Pronto para o seu Dever de Casa aqui
    You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.



  1. simu
    Posts:9417


    Comment Arrow

    Publicado em: 20/10/2011 13:17:58

    testei esse código é está funcionando!
    Abro a janela,
    mudo para o MySQL Data Browser para inserir um novo grupo ou subgrupo,
    volto para a janela,
    que dispara o formWindowGainedFocus e
    atualiza a JTree corretamente (mas todos os nós fechados).

    O problema deve estar em outro lugar, mas algo que não gostei é estar usando a Thread da GUI para acessar o banco e montar o modelo - já deve ter escrito isso uma ou duas vezes no fórum [:-) !

    [[]]

    [quote="sekkuar"]estou com um problema com JTree,

    eu preciso criar ela, a partir do banco de dados.

    Onde eu tenho uma tabela Grupo


    ou seja, um grupo pode ter vários subgrupos, e estes podem ter seus subgrupos.... e por ai vai.

    eu montei o modelo da JTree de forma recursiva, primeiro eu faço uma busca de todos os grupos sem a chave estrangeira, depois, para cada grupo retornado, eu pesquiso se ele é supergrupo, e repito para todos os subgrupos, até não retornar mais nada.


    Para montar a arvore da primeira vez, funciona, mas, eu quero que a árvore seja atualizada toda vez que a janela ganhar o focus, por isso, criei um WindowFocusListener, e mandei ele re-fazer a pesquisa e re-fazer o modelo da JTree.


    Teoricamente, todos os métodos chamados estão sendo executados, e, ele atualiza a JTree, mas apenas quando os dados não foram alterados,

    por exemplo, eu adiciono um novo grupo na tabela, da proxima vez que ele for atualizar, ele não desenha mais a árvore, ela fica cinza e nada aparece nela.

    aqui estão os códigos relevantes



    Da primeira vez ele preenche certo, se os dados não mudarem, ele preenche certo, mas, quando os dados mudam, a JTree não é desenhada mais, só se eu criar uma nova Tela.


    _________________

      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.



  1. sekkuar
    Posts:5998


    Comment Arrow

    Publicado em: 20/10/2011 13:22:28

    Não não, eu criei um runnable para atualizar, só não postei pra não ficar longo.



    só que isso implica em mostrar o refresh, que implica em mostrar outras coisas.... e o código ia ficar longo demais, por isso não postei.


    Mas tem razão! não tinha testado inserindo direto no banco, ai funciona.

    O problema está na classe que cadastra um novo grupo, ela estava mexendo direto no modelo da JTree e acabava estragando ela.

    Valew pela dica Simu.


    E já aproveitando, tem algum jeito melhor de se fazer isso?
    porque, se eu tiver muitos subgrupos, ele vai fazer um numero muito grande de consultas no banco.
    _________________

    Sekkuar ~ Ex-Catador Executivo do Javafree - (Não mais) Catando os tópico tudo.
    "The mod javafree deserves, but not the one it needs right now."

    Stack Traces existem pra ajudar e não para trazer uma mensagem de satã dizendo que seu computador será destruído.


    Peça seu Código Pronto para o seu Dever de Casa aqui
    You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.



  1. simu
    Posts:9417


    Comment Arrow

    Publicado em: 20/10/2011 13:33:54

    deveria ter desconfiado... mas não tem como eu adivinhar o que não foi postado.

    Jeito melhor: talvez se ler todos os registros de uma vez, passar para uma List (ou outra forma temporária) e a partir desta criar o modelo.

    [[]]

    [quote="sekkuar"]Não não, eu criei um runnable para atualizar, só não postei pra não ficar longo.



    só que isso implica em mostrar o refresh, que implica em mostrar outras coisas.... e o código ia ficar longo demais, por isso não postei.


    Mas tem razão! não tinha testado inserindo direto no banco, ai funciona.

    O problema está na classe que cadastra um novo grupo, ela estava mexendo direto no modelo da JTree e acabava estragado ela.

    Valew pela dica Simu.


    E já aproveitando, tem algum jeito melhor de se fazer isso?
    porque, se eu tiver muitos subgrupos, ele vai fazer um numero muito grande de consultas no banco.


    _________________

      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.



  1. sekkuar
    Posts:5998


    Comment Arrow

    Publicado em: 20/10/2011 13:38:21

    Eu também pensei nisso,

    mas, será que ficar lendo a lista, e procurando onde tem algum com o índice certo, vai acabar demorando mais ainda.

    O banco de dados faz a seleção de forma melhor.
    _________________

    Sekkuar ~ Ex-Catador Executivo do Javafree - (Não mais) Catando os tópico tudo.
    "The mod javafree deserves, but not the one it needs right now."

    Stack Traces existem pra ajudar e não para trazer uma mensagem de satã dizendo que seu computador será destruído.


    Peça seu Código Pronto para o seu Dever de Casa aqui
    You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.



  1. sekkuar
    Posts:5998


    Comment Arrow

    Publicado em: 20/10/2011 13:49:05

    E já pra deixar aqui caso alguém precise, para todos os nós ficarem expandidos depois que atualiza, fiz esse método


    _________________

    Sekkuar ~ Ex-Catador Executivo do Javafree - (Não mais) Catando os tópico tudo.
    "The mod javafree deserves, but not the one it needs right now."

    Stack Traces existem pra ajudar e não para trazer uma mensagem de satã dizendo que seu computador será destruído.


    Peça seu Código Pronto para o seu Dever de Casa aqui
    You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.



  1. simu
    Posts:9417


    Comment Arrow

    Publicado em: 20/10/2011 14:03:14

    [quote="sekkuar"]Eu também pensei nisso,

    mas, será que ficar lendo a lista, e procurando onde tem algum com o índice certo, vai acabar demorando mais ainda.

    O banco de dados faz a seleção de forma melhor.



    cada comando para o banco tem bastante overhead, o problema é saber o que é pior...

    Acho que alguns banco de dados até tem funções para retornar dados hierárquicos como os acima.

    [[]]
    _________________

      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.



  1. jonatarussi
    Posts:5


    Comment Arrow

    Publicado em: 09/12/2011 11:16:09

    E ai galera.

    Vou aproveitar o tópico.

    Estou com um problema:
    Minha jTree estou construindo a partir de dados do banco de dados, até aí tudo bem. o unico problema que estou tendo é quando adiciono um novo item. Estou dando um reload(), mas a árvore inteira é recarregada e os nós abertos pelo usuário acabam se fechando.
    Alguém sabe um método para inserir o novo nó/folha sem fechar a jTree ?

    Obrigado



  1. sekkuar
    Posts:5998


    Comment Arrow

    Publicado em: 09/12/2011 11:24:21

    [quote="jonatarussi"]E ai galera.

    Vou aproveitar o tópico.

    Estou com um problema:
    Minha jTree estou construindo a partir de dados do banco de dados, até aí tudo bem. o unico problema que estou tendo é quando adiciono um novo item. Estou dando um reload(), mas a árvore inteira é recarregada e os nós abertos pelo usuário acabam se fechando.
    Alguém sabe um método para inserir o novo nó/folha sem fechar a jTree ?

    Obrigado



    É só depois do reload você expandir de novo.
    O método que faz isso está ali em cima.

    (já tinha postado pra não perguntarem!!!)

    [quote="sekkuar"]E já pra deixar aqui caso alguém precise, para todos os nós ficarem expandidos depois que atualiza, fiz esse método


    _________________

    Sekkuar ~ Ex-Catador Executivo do Javafree - (Não mais) Catando os tópico tudo.
    "The mod javafree deserves, but not the one it needs right now."

    Stack Traces existem pra ajudar e não para trazer uma mensagem de satã dizendo que seu computador será destruído.


    Peça seu Código Pronto para o seu Dever de Casa aqui
    You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.



  1. jonatarussi
    Posts:5


    Comment Arrow

    Publicado em: 09/12/2011 11:29:08

    Sim até tinha visto esse método ali.

    Mas o problema é que esse método vai expandir todos os nós né. O certo seria expandir apenas os que ja estavam expandidos.

    Tem como fazer?



  1. sekkuar
    Posts:5998


    Comment Arrow

    Publicado em: 09/12/2011 11:41:34

    [quote="jonatarussi"]Sim até tinha visto esse método ali.

    Mas o problema é que esse método vai expandir todos os nós né. O certo seria expandir apenas os que ja estavam expandidos.

    Tem como fazer?



    hummm..... acho que algo desse tipo deve funcionar (não testado)

    _________________

    Sekkuar ~ Ex-Catador Executivo do Javafree - (Não mais) Catando os tópico tudo.
    "The mod javafree deserves, but not the one it needs right now."

    Stack Traces existem pra ajudar e não para trazer uma mensagem de satã dizendo que seu computador será destruído.


    Peça seu Código Pronto para o seu Dever de Casa aqui
    You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.



  1. jonatarussi
    Posts:5


    Comment Arrow

    Publicado em: 09/12/2011 14:09:52

    [quote="sekkuar"]

    hummm..... acho que algo desse tipo deve funcionar (não testado)



    Então, com esse código ele expande, mas se usar o reload(), não atualiza a tree, entao fiz um metodo que preenche toda tree novamente, mas aí o método que voce sugeriu não expande



  1. sekkuar
    Posts:5998


    Comment Arrow

    Publicado em: 09/12/2011 14:14:10

    então não tem como.


    Quando você da reaload, ele monta o modelo de novo, o mode e todos os nós são novos, não tem como saber qual nós estavam expandidos antes, é como se fosse uma nova árvore
    _________________

    Sekkuar ~ Ex-Catador Executivo do Javafree - (Não mais) Catando os tópico tudo.
    "The mod javafree deserves, but not the one it needs right now."

    Stack Traces existem pra ajudar e não para trazer uma mensagem de satã dizendo que seu computador será destruído.


    Peça seu Código Pronto para o seu Dever de Casa aqui
    You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.



  1. simu
    Posts:9417


    Comment Arrow

    Publicado em: 09/12/2011 15:20:29

    Não sei como montou o JTree, mas não seria mais fácil adicionar o novo nó na árvore, ou melhor, ao nó pai sem fazer o reload?

    O MutableTreeNode tem um método insert, o DefaultMutableTreeNode adicionalmente o add
    (imagino que o reload faz assim)

    [[]]
    _________________

      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.



  1. jonatarussi
    Posts:5


    Comment Arrow

    Publicado em: 09/12/2011 16:13:52

    [quote="simu"]Não sei como montou o JTree, mas não seria mais fácil adicionar o novo nó na árvore, ou melhor, ao nó pai sem fazer o reload?

    O MutableTreeNode tem um método insert, o DefaultMutableTreeNode adicionalmente o add
    (imagino que o reload faz assim)

    [[]]



    Sim, usei o add, o problema é a arvore não atualiza.



    Esse é meu código, o problema é que não atualiza a tree



  1. simu
    Posts:9417


    Comment Arrow

    Publicado em: 09/12/2011 21:13:48

    [quote="jonatarussi"][quote="simu"]Não sei como montou o JTree, mas não seria mais fácil adicionar o novo nó na árvore, ou melhor, ao nó pai sem fazer o reload?

    O MutableTreeNode tem um método insert, o DefaultMutableTreeNode adicionalmente o add
    (imagino que o reload faz assim)

    [[]]



    Sim, usei o add, o problema é a arvore não atualiza.



    Esse é meu código, o problema é que não atualiza a tree



    Desculpa, falha minha, acabei de verificar os tutoriais da Sun/racle.
    O processo é um pouco mais complicado, tem que adicionar o nó através do TreeModel:
                        (não testado - nenhuma IDE foi ferida/usada durante a produção desse código)

    Tutorial: Dynamically Changing a Tree
    [[]]
    _________________

      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.



  1. jonatarussi
    Posts:5


    Comment Arrow

    Publicado em: 12/12/2011 15:30:33

    Poisé cara, ja fiz isso, o problema é que a árvore não atualiza automatico, e se eu der um model.reload() ele atualiza, mas os nós que estavam abertos, voltam todos fechados.

    Será que tem como fazer para inserir o nó e atualizar a arvore mantendo os nós que ja estavam abertos?

    Valeu



  1. alleson
    Posts:1


    Comment Arrow

    Publicado em: 04/01/2016 20:29:18

    Olá estou montando um jtree com base nas informações que estão no banco de dados e no seu exemplo acima tem tudo oque eu necessito oque me deixou confuso foi somente esta linha oque significa ?

    "Grupo g = new nucleos2.pr.Grupo(id_grupo, grupo, id_super_grupo); "



  1. Relacionados