Thread Contador JLabel e JprogressBar para atualizar no swing

Boa tarde !!!

Pessoal preciso de uma ajudinha.

meu problema é o seguinte, fiz um programa onde ele vai gerar N quantidade de Registro.

e preciso que a cada registro, o contador seja atualiza em uma label.
exemplo 1.2.3.4.5… junto um barra de progresso, para que o usuário tenha um status em qual processo o programa está.

pois bem consegui fazer a barra de progresso e a label atualizar, Problema ela só faz quando o programa termina de gerar os registros.

segue o código se alguém souber e poder me ajudar a resolver esse problema fico grato.

Classe do Formulário Abaixo.



 //Variavel de controle da thread do processo  
    private Thread processo;
    /** 
     * Executa o processo da aplicação 
     */  
    private void executaProcesso() {  
        if(processo==null) { //Instancia a thread SE não existir uma  
            processo = new Thread(new classeProcesso(this));  
            processo.start();  
        } else {  
           System.out.println("O processo ainda está em execução");  
       }     
   } 


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {
          if(Fac.Modalidade()){
             jComboBox1.setEnabled(false);
             jComboBox2.setEnabled(false);
             jComboBox3.setEnabled(false);
             jComboBox4.setEnabled(false);
             jTextField1.setEnabled(false);                                     
             jFormattedTextField1.setEnabled(false);
             JFileChooser fileChooser = new JFileChooser("C:/Amarildo/Boleto"); // Força a Abrir em uma Pasta Determinada
             fileChooser.showOpenDialog(tela);                                  // Abri Chooser na Tela
             File Arquivo_Entrada = fileChooser.getSelectedFile();              // Grava Arquivo Selecionado
             jTextField1.setText(Arquivo_Entrada.getName().toUpperCase());      // Repassa Somente o Nome do arquivo Selecionado no Chooser Para Caixa de Texto Arquivo de Entrada
             Config.setArquivo(Arquivo_Entrada.getName().toUpperCase()); 
            if(Config.getArquivo() != null){
              Dados.Zap();                                                      // Limpa os Bancos Antes de Carregar
              Dados.Append(Arquivo_Entrada);                                    // Carrega O Banco Com os Dados
              if(Config.getGera().equals("Produção")){Fac.Processa();}
              Imprime.Spool(Config.getArquivo());
            }
              executaProcesso();
              
             jLabel9.setText("Saida......:"+Util.Space(05)+Config.getArquivo());
             jLabel13.setText("Contador...:"+Util.Space(05)+Config.getContador());
             jLabel10.setText("Local.........:"+Util.Space(05)+Config.getLocal());
             jLabel11.setText("Estadual...:"+Util.Space(05)+Config.getEstadual());
             jLabel12.setText("Nacional...:"+Util.Space(05)+Config.getNacional());

          }
        } catch (SQLException ex) {
            Logger.getLogger(Boleto.class.getName()).log(Level.SEVERE, null, ex);
        }
    }         


/** 
     * Atualiza a tela 
     * @see java.util.Observer#update(java.util.Observable, java.lang.Object) 
     * @param o Objeto que sofreu uma atualização 
     * @param arg Argumento passado pelo objeto para seus observadores 
     */  
    @Override
    public void update(Observable o, Object arg) {  
        if(arg instanceof Integer) {  
            jProgressBar1.setValue(((Integer) arg));
            jLabel13.setText("Contador...:"+Util.Space(2)+String.valueOf(((Integer) arg).intValue()));  
        } else if(arg instanceof Boolean) {  
            if( ((Boolean) arg) ) {  
                jProgressBar1.setValue(0);  
                jLabel14.setText("Processo finalizado!");  
            }  
        }  
    }  
                    

Classe Observador

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller;

import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author JavaX_JavaX
 */
public class classeProcesso  
    extends Observable  
    implements Runnable {  
  
    /** 
     * Construtor que recebe um objeto que irá observa-lo 
     * @param observador Objeto que irá acompanhar as mudanças deste objeto 
     */  
    public classeProcesso(Observer observador) {  
        //Adiciona o objeto observador a lista de observadores  
        addObserver(observador);  
        //...outras inicializações  
    }  
      
    /** 
     * Ponto de entrada da Thread. 
     * @see java.lang.Runnable#run() 
     */  
    public void run() {  
        Configura Config =  Configura.getInstance();
        int i;  
        int Numero;  

        System.out.println("Verifica = "+Config.getContador());
        for(i=0; i<= Integer.parseInt(Config.getContador()); i++) {  
                Numero = 100 * i / Integer.parseInt(Config.getContador()) + 1;
                notifyObservers(Numero);  
                setChanged();  
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                Logger.getLogger(classeProcesso.class.getName()).log(Level.SEVERE, null, ex);
            }
        }  
        notifyObservers(true);  
        setChanged();   
    }  
  
}  

Classe Spool Onde os Registros são processados um a um

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Controller;

import Controller.Boleto.BoletoBancos;
import Controller.Boleto.GerarBoleto;
import Model.Banco;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *
 * @author Javax_javax
 */
public class Spool {

   private ResultSet Eof;
   private int sequencia, SeqX, SeqExt = 1, Ind1 = 1;
   

/**
  Metodo para, Criar Spool de Impressão para Posicionamento de Variaveis     <p>
  1 Argumentos                                                               <p>
  1º do tipo String                                                          <p>
  Exemplo de Uso = Spool(String Arquivo);                                    <p>
  Retorno void                                                               <p>
  * @param Arquivo
  * @throws java.sql.SQLException
 */
  public void Spool(String Arquivo) throws SQLException {  

  // Começo Conecta Banco de Dados em Run Time , Em tempo de Execução
    final Banco conexao = new Banco();                                          //Estancia da Classe BancoDao Para Criar o Objeto Conexãoo
    conexao.connect();                                                          //Conexão com o Banco

    
  // Começo Seleciona Banco de Dados ************************************   
    conexao.executeSQL_BdNavigator("Select * From App.Tipo01 Order By Cep Asc");// Seleciona o Banco de Dados Por Ordem de Cep
  // Final Seleciona Banco de Dados *** *********************************   
  
  // Começo Criação de Variavel Eof ,com Resultado de um ResultSet ******
    Eof = conexao.resultset;                                                    // Eof ou End Of File  Enquando não for final de Arquivo
  // Final Criação de Variavel Eof ,com Resultado de um ResultSet ******
    
    Eof.last();                                                                 //-----\  Percorre Banco Até o Fim
    int count = Eof.getRow();                                                   //----- > count agora tem o numero de linhas do ResultSet
    Eof.beforeFirst();                                                          //-----/  volta o cursor la pra cima pra vc realizar suas tarefas. Como Um "Goto Top" No Banco

    QtdeArqs = count/Quebra + 1;                                                //----- > Retorna a Quantidade Total De Arquivos Que Serão Gerados
    
   // Começo Deletar Aquivos Para Gerar Novos ********************************   
    for (int X = 1; X <= QtdeArqs; X++) {                                       //-----\  Faz Até Atingir a Quantidade de Arquivos 
      Util.DeleteFile(Arquivo+"."+Util.Padl(Integer.toString(X),03,"0"));                 //----- > Deleta Os Arquivo para Gerar Novos Arquivos
      Util.DeleteFile(Arquivo+Util.Padl(Integer.toString(X),03,"0")+".Pdf");              //----- > Deleta Os Arquivo para Gerar Novos Arquivos
    }                                                                           //-----/  Apenas se Os Arquivos já Existirem na Pasta
   
    Util.DeleteFile(Arquivo+".OS");                                                  //----- > Deleta Arquivo .Os Para Gera Novo Arquivo
   // Final Deletar Aquivos Para Gerar Novos  ********************************

    while (Eof.next()) {                                                        // Eof ou End Of File  Enquando não for final de Arquivo
     sequencia++;
     SeqX++;

   
    } // Fim do While
      Eof.close();
      conexao.disconnect();
  }

}