JProgressBar não atualiza

Pessoal, já tentei de diversas formas mas não consigo atualizar um JProgressBar durante um processo que trabalha com alguns arquivos.
Usei Threads, SwingUtilities.invokeLater, etc. Minha última implementação usa uma variável que é alterada durante as etapas desse processo indicando a percentagem concluída. Criei uma Thread que depois de iniciada, fica atualizando a JProgressBar a partir dessa variável. São portanto duas Threads : uma para o processo e outra para a JProgressBar. Mas quando disparo o processo (por um JButton) toda a interface trava até que o processo seja concluído, inclusiva a progressBar.
Do que estou me esquecendo ?

generateButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					processFiles();
...

protected void processFiles() {
		ProgressThread progressThread = new ProgressThread(this, getProgressBar());
		 SwingUtilities.invokeLater(progressThread);

progressCounter = 0;
		processFile("1.Importado HW", referenceFile, tempFileImportedHW);
		progressCounter = 30;
		processFile("2.Importado SW", tempFileImportedHW, tempFileImportedSW);
		progressCounter = 60;
		processFile("2.Importado SW CHIND", tempFileImportedSW, DEFAULT_GENERATED);
		progressCounter = 100;
...
package view.util;

import javax.swing.JProgressBar;

import view.WizardCSVExcelWindow;

public class ProgressThread implements Runnable{
	private WizardCSVExcelWindow parent;
	private JProgressBar progressBar;
	
	public ProgressThread(WizardCSVExcelWindow parent, JProgressBar progressBar) {
		this.parent = parent;
		this.progressBar = progressBar;
	}
	
	public void run() {
		int value = 0;
		for(int c = 0; c < 10; c++) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {}
			value = parent.getProgressCounter();
			progressBar.setValue(value);
			progressBar.repaint();
		}
	}
}

Dê uma olhada em SwingWorker para fazer isso que queres!

Abraços!

Esse comando:

SwingUtilities.invokeLater(progressThread);

Está empilhando o runnable para ser executado dentro da thread do swing. Não é isso que você quer. Você quer a execução de uma nova thread. Substitua-o por:

new Thread(progressThread).start();

Outra coisa, certifique de que a leitura e a escrita da variável progressCounter está sendo feita em um bloco sincronizado, ou que a variável foi declada como o modificador volatile.

Não é necessário chamar repaint() na progressBar() depois do comando setValueAt. O próprio set se encarrega disso.

Muito obrigado amigos !
Testei ambas as soluções mas só consegui fazer funcionar a com SwingWorker do ajfilho. A que usa Threads, ViniGodoy, por alguma razão não está fiuncionando dentro do meu código. De qualquer forma muito obrigado. :smiley:

Você deu um “new” na classe Thread e deu start() (e não run()) assim como postei ali em cima?

Em todo caso, depois do Java 5 não tem porque não usar o SwingWorker mesmo. Mas é bom saber o que deu errado, principalmente porque você pode vir a precisar das threads no futuro.