[RESOLVIDO] JProgressBar não está atualizando dentro de uma Thread
4 respostas
eliangela
Olá pessoal!
Estou com um problema clássico com um JProgressBar.
Eu tenho um JFrame com alguns menus. Ao clicar no menu Abrir Arquivo eu mostro um FileChooser para escolher um arquivo para leitura.
O problema é que esse arquivo é “muito grande mesmo” e eu resolvi criar um JDialog com um JProgressBar para mostrar ao usuário que o programa não travou.
Não estou usando porcentagem na minha barra de progresso. Apenas setei ela como setIndeterminate(true).
Então meu código está mais ou menos assim:
if(fileChooser.showDialog(this)==JFileChooser.APPROVE_OPTION){//caso a pessoa escolha algum arquivonewThread(){@Overridepublicvoidrun(){FrameProgresso.getInstance().setVisible(true);}}.start();}
Esse código abre normalmente a JDialog, mas apenas mostra as bordas da janela… não mostra o conteúdo todo.
O que eu preciso fazer pra corrigir?
O processamento que muda o valor da barra de progresso deve estar em outra thread. Não o setVisible.
O setVisible só deixa a barra visível, mais nada.
Vini, Não fiz nenhum processamento pra alterar o valor da barra, eu apenas setei ela como indeterminada (setIndeterminate(true)).
Eu apenas quero mostrar a JDialog (com a barra dentro) quando eu estiver abrindo o arquivo e fechar a JDialog quando o arquivo já estiver todo aberto.
O meu código faz isso (abre e fecha a janela), Mas o problema é que está mostrando somente as bordas da janela e o conteúdo está ficando “transparente”.
O que mais pode ser?
Obrigada
eliangela
Obrigada pela ajuda Vini!
Descobri que a minha JDialog não estava atualizando porque a Thread do Swing estava “presa” esperando o arquivo abrir.
Solucionei isso colocando a Dialog numa Thread e a abertura do arquivo em outra.
Vlw pela ajuda
ViniGodoy
Então é isso mesmo. Você não pode deixar um processamento que “segure” a aplicação na thread do Swing. O swing roda numa espécie de loop assim:
while (true) {
processaEventos();
if (temEventoDeRepaint)
repintaTela();
}
O processa eventos é onde ele captura os eventos do SO e redireciona para seus componentes. Se vc travar a leitura num componente, o código nunca chegará ao repinta a tela.
Um dos eventos possíveis é o de repaint. Ele é disparado através do comando repaint(). Mas, como vc pode ver, é inútil dispara-lo, pois, se o processaEvento estiver travado, ele nunca chegará ao if, ali de baixo.