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 );
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.
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.
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: