Espero que você entenda minha explicação.
Eu fiz isso na prática, já que um dia eu estava entediado e não tinha nada de interessante para fazer.
Bom…
Você tem uma classe que estende de JFrame e ela tem um um JProgressBar.
A CLASSE que você irá processar os dados você deve colocá-la em thread, assim poderá renderizar, e faça também um método nessa classe que receba um JProgressBar.
nessa classe você irá tratar a execução.
No programa que fiz, a classe de frame é apenas para o frame, toda a logica do que o programinha faz está em outra classe de outro pacote (mas isso é claro que é opicional).
private void btnOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOKActionPerformed
if (btnOK.getText().equals("Procurar")) {
lista.setText("");
busca.setText("");
search = new Search(sDir.getText(), sExt.getText(), sNome.getText(), sContent.getText());
Thread t = new Thread(search);
prog.setStringPainted(true);
search.setProgressBar(prog);
search.listas(lista, busca);
search.setButton(btnOK);
status = new JLabel("status");
search.setStatus(status);
btnOK.setText("Cancelar");
t.start();
} else {
search.stop();
btnOK.setText("Procurar");
}
}//GEN-LAST:event_btnOKActionPerformed
No método acima, o botão faz uma instância de Search, que é a classe que exatamente irá fazer a lóigca que quero, passa ele em thread e seta um JProgressBar em um método que fiz na classe Search, lá eu controlo ele da seguinte forma…
public void setProgressBar(JProgressBar bar) {
prog = bar;
}
public void calcularPorcentagem(int qtdTotal, int count) {
int x = (100 * count) / qtdTotal;
prog.setValue(x);
}
Acho que daí já da para você entender um pouco de como funciona a lógica. Espero que lhe ajude.