Jprogressbar em thread

7 respostas
L

Problema:

Como executar uma JProgressbar em uma thread invocada por um JButton e que a mesma rode por 10 segundos e de 1 em 1 segundo atualize a JProgressBar na tela principal.

acho que seria um bom exemplo para o pessoal em geral, vi muitos postes que o problema resume nisso.

7 Respostas

_
final JProgressBar progressBar = new JProgressBar();
progressBar.setMaximum( 10 );
JButton button = new JButton( "go" );
button.addActionListener( new ActionListener() {
    public void actionPerformed( ActionEvent e ) {
        new Thread( new Runnable() {
            public void run() {
                for( int i = 1; i <= 10; i++ ) {
                    progressBar.setValue( i );

                    try {
                        Thread.sleep( 1000 ); // 1s
                    } catch( Exception e ) {
                        e.printStackTrace();
                    }
                }
            }
        } ).start();
    }
} );
G

Lipe,

O jeito correto de fazer a atualização não seria este aqui?

for( int i = 1; i <= 10; i++ ) {
   final int newVal = i;
   SwingUtils.invokeLater(new Runnable(){
      public void run(){ 
         progressBar.setValue( newVal );
      }
    });

   (...) 
}

Os componentes swing não são thread-safe, então acho que não é uma boa usar um thread diferente do da UI para atualizar os valores.

Abraços,

L

pareque que quando se usa o invoke later ele trava o processamento todo, e so aparece no final da execução e usar thread não trava mas não atualiza, por isso estou perdido tentei os dois modos e nenhum deu certo, eu não entendo muito de swing, mas isso me parece ser um problema comun, talvez esteja também instânciando o objeto a atualizar dentro do método, vou verificar.

G

Eu uso a solucao do lipe com repaint no form e no progress logo depois de atualizar e funciona numa boa.

_

Hum, executei o código que postei com Java 1.5 e não foi necessário chamar repaint. Sei lá.

No Java 1.5 há outras features para trabalhar com Threads e Swing, recomendo que as estude.

S

Eu quero estudar também :slight_smile: Você não teria algum link, ou você poderia elaborar um pouco mais?

[]s,
Sami

G

Ois,

Que estranho, esse código funciona muito bem prá mim (exceto pelo fato de que o nome da classe é SwingUtilities e não SwingUtils).

Vou aproveitar para lembrar que você não pode acessar componentes swing diretamente de outros threads. Um artigo meio velho que trata desse problema é este aqui:

http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

Abraços,

Criado 9 de junho de 2006
Ultima resposta 12 de jun. de 2006
Respostas 7
Participantes 5