Atualizar status durante processamento

1 resposta
smota

Ola Pessoal,

Estou com um problema, desenvolvi uma aplicação sem pensar em threads (entao o desenho nao permite sem muito trabalho adicionar threads) e agora estou na m*.

Tenho uma barra de status para descrever o que o meu programa esta fazendo e um JProgressbar … mas apesar de estar setando o texto e os passos no progressbar (setText e setValue) eles nao sao visiveis pq meu loop eh muito pesado e ateh a tela de OK pro processamento fica visivel ateh terminar o processamento (ele nao redesenha a tela nem os controles ateh terminar o loop).

Tem como eu obriga-lo a dar um tempo no loop E redesenhar tudo? (.redraw() nao funciona) …

Ou chamar o setText() e setValue() em um novo thread a cada iteracao do loop?

Seila, soh pro usuario saber o que esta acontecendo mas sem eu ter um trabalhao pra suportar threads do jeito certo.

Obrigado

1 Resposta

mlopes

Bom,

Pelo que eu entendi o processamento todo está sendo feito na EventDispatchThread, ou seja, vc não vai conseguir redesenhar coisa alguma já que sua única thread está ocupada.

Vc tem que colocar esse processamento em outra thread, não é dificil. Todas as vezes que vc precisar fazer um update, chame SwingUtilities.invokeLater() ou SwingUtilities.invokAndWait().

Ai sim vc vai ver os updates. Chamar redraw() apenas coloca uma nova “task” para a thread, que não pode executá-la. Pelo mesmo motivo o sleep não funciona.

Resumindo, crie um Runnable, coloque o loop dentro do run(), e tenha certeza de que todos os métodos Swing, excluindo os setText de quaquer subclasse do JTextComponent (pois é Thread safe) são chamados com as ferramentas que já mencionei acima.

Agora, qdo o usuário clicar no seu OK, crie uma Thread com o Runnable…

Agora, se vc quer realmente investigar um modo de fazer sem thread… boa sorte. Acho que tem um jeito, mas não aconselho. Vc teria que chamar o paint dos components manualmente… mal.

[]'s

Criado 12 de março de 2003
Ultima resposta 13 de mar. de 2003
Respostas 1
Participantes 2