Pessoal estou com o seguinte problema eu tenho um JFileChooser para salvar um arquivo e quando o cara clica em salvar eu abro JinternalFrame com uma JProgressBar e chamo Trhead.sleep(500) para atualizar a progrees.
Só que o problema que na hora que o cara clica em salvar o JfileChooser soma da tela mais fica um fundo cinza do tamanho do mesmo e não chego ver minha tela de progress em andamento so vejo ela quando acaba o preenchimento ja usei repaint() updateUI() no meu desktopPane mais nao adianta nada desde já grato
Na verdade, é o outro processo que deve estar numa thread.
A progress bar responde a eventos do Swing, que são processados na Thread da AWT.
Sempre que um botão é clicado, o código dos listeners é executado dentro dessa thread. Então, se esse código for lento demais, você vai notar que a aplicação congela, mostra telas em cinza, etc.
Para resolver esse problema, basta mover o código demorado para outra thread e, de lá, apenas mandar mensagens para os componentes se atualizarem. Assim a thread da AWT continuará processando eventos, seu trabalho será feito em outro lugar e seu progress bar será pintado normalmente.
A menos que o componente seja Thread-safe, é necessário que essas mensagens sejam enviadas para a fila da AWT, da seguinte forma:
EventQueue.invokeLater(new Runnable() {
public void run() {
barraDeProgresso.setValue(2);
}
}
Geralmente, os eventos thread-safe contém o seguinte texto em seu Java doc: This method is thread safe, although most Swing methods are not. Please see Threads and Swing for more information.
Sobre esse assunto, vale a pena consultar: Lesson: Concurrency in Swing da própria Sun. Aqui ele fala também da classe SwingWorker, que facilita esse trabalho de multi-threading e Swing.