Tenho uma pequena rotina que dentro de um While que executa aproximadamente 4.000 voltas, atualizo um object jTextField. Acontece que a atualização não é apresentada na tela. Então eu busquei na net um comando que faça a função do DoEvents do Visual Basic, encontrei um método Thread.sleep() mas não consegui fazer funcionar. Alguem sabe como resolver isso?
O método Thread.sleep() faz uma thread (e não o programa todo) dormir, e permite que outras threads executem enquanto isso.
Entretanto, fique atento para o seguinte:
Se o seu método está dentro de um evento de botão, ele estará também rodando na thread da AWT. Essa é a mesma thread que faz a pintura do componente. Portanto, alterar diversas vezes o valor do componente, ou colocar essa thread para dormir, não resolverá o problema, uma vez que a atualização em si só ocorrerá após a execução do seu método.
Mesmo rodando em outra Thread, a AWT é autorizada a fazer “event coalescing”, ou seja, se várias ações de repaint são encaminhadas ao mesmo tempo, ela pode ignorar todas e executar apenas algumas. A explicação disso é simples. Não adianta atualizar mais rápido do que o olho pode ver. É preferível então agrupar esses eventos e gerar um aplicativo com mais performance e menos flicking.
A solução para seu problema é rodar o código em outra thread, e pedindo para essa outra thread empilhar eventos na AWT. Como você fará muitas atualizações, cabe dar um pequeno sleep() nessa outra thread, para que a AWT processe o repaint().
Não sei exatamente para quê você quer fazer isso. Dependendo da razão, pode haver uma solução melhor que essa.
A rotina de atualização do seu JTextField deve ser colocada em uma Thread diferente daquela da aplicação. Você pode fazer isso com uma classe que implemente Runnable, daí no método run() você deve colocar o seu While e o Thread.sleep() ou usar um TimerTask, onde não será necessário nem do While, bastando agendá-lo para o intervalo de tempo que você colocaria no sleep.