JFrame trava - não atualiza

6 respostas
julianofischer

Boa tarde amigos,

estou fazendo um software simples e estou com um pequeno problema.

Tenho um JFrame, dentro do mesmo coloquei uma JTable e um JProgressBar.

Após inicializar o JFrame eu chamo um método que não faz nada além de adicionar linhas a tabela e atualizar o valor do JProgressBar.
No entanto, dentro deste método eu chamo o método wait e espero por alguns segundos antes de adicionar uma nova linha.
Aí que surge o problema.
O JFrame só é atualizado quando todas as linhas são adicionadas. Durante a execução aparece a imagem que estava no fundo do JFrame, por exemplo, os ícones do Windows.
Verifiquei que ao utilizar um JOptionPane.showMessageDialog() entre a adição de uma linha e outra o JFrame é atualizado.

Imagino que alguns já devem ter passado por problemas semelhantes. Espero a ajuda de vocês.
Abraços

6 Respostas

ViniGodoy

Mova o processamento pesado para outra Thread.

Enquanto ele ocupar a thread do Swing, nada na tela atualiza. O wait vai manter o Swing parado.

Para mais informações:
http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html
http://download.oracle.com/javase/tutorial/uiswing/components/progress.html

rael_gc

Acontece que o wait faz o thread da aplicação esperar, e por um acaso é o mesmo Thread da sua aplicação Swing.
Tenta dar uma olhadinha em como usar Swing e Threads pra resolver seu problema.

julianofischer

Gostei das dicas galera!
vou tentar resolver ai aviso se obtive sucesso
abraços

E

Se olhar os meus programas vai ver que eu:

a) Não costumo tentar sincronizar threads com “wait” e “notify”. Eu simplesmente acho isso muito, muito, muito complicado - nem sei por que “wait”, “notify” e “new Thread” não foram classificadas como o “goto” - existem mas não devem ser chamadas diretamente; só profissionais especialistas (como o professor Doug Lea) é que sabem mexer corretamente com isso sem se queimarem. O resto dos comuns mortais deve usar algum encapsulamento desses métodos que está no pacote java.util.concurrent (100% designado e 95% programado pelo professor Doug Lea).

b) wait != sleep

c) Se for preciso usar alguma sincronização entre tarefas que seja mais complicado que um simples Thread.join, então é melhor sempre usar alguma das N classes do pacote java.util.concurrent.

lucasportela

Pesquise sobre SwingWorker
é justamente a solução que você quer

julianofischer

Valeu todo mundo.
Muito obrigado.
Utilizei a classe SwingWorker para resolver meu problema.

Abraços

Criado 5 de janeiro de 2011
Ultima resposta 6 de jan. de 2011
Respostas 6
Participantes 5