Jprogressbar em thread

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.

[code]
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();
}

} );[/code]

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,

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.

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.

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

[]s,
Sami

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,