JprogressBar + Observable

Boa Tarde Galera!
Estou usando jProgressBar + Observer.Porém não está funcionando perfeitamente.Quando informo os parametros necessarios, clico em importar, chama o metodo executaProcesso() na primeira vez é tranquilo a barra de progresso vai direitinho.
Porém se tentar importar novamente a barra não é iniciada.
Será que pelo fato do método executaProcesso() usar processo.start(); ele nao sai do “O processo ainda está em execução”
Estou usando o exemplo aqui do GUJ.
Obrigada.

[code]public class TelaPrincipal extends JFrame implements ItemListener,Observer{

public JProgressBar progressBar;
public static int TAM_PROCESSO = 1000000000;
private Thread processo;


public TelaPrincipal() {
	super();
	initialize();
}


public static void main(String[] args) {
	new TelaPrincipal();
}

private void initialize() {
	
	jLabelRC = new JLabel();
	jLabelRC.setBounds(new Rectangle(15, 12, 28, 16));
	jLabelRC.setText("RC:");
	jLabelInserirDataTarifa = new JLabel();
	jLabelInserirDataTarifa.setBounds(new Rectangle(204, 17, 72, 16));
	jLabelInserirDataTarifa.setText("Data Tarifa:");
	jLabelAtualizar = new JLabel();
	jLabelAtualizar.setBounds(new Rectangle(508, 15, 109, 16));
	jLabelAtualizar.setText("Fechar Vigência");
	jLabelInserir = new JLabel();
	jLabelInserir.setBounds(new Rectangle(402, 16, 83, 16));
	jLabelInserir.setText("Abrir Vigência");
	jLabelNomeArquivoEnviar = new JLabel();
	jLabelNomeArquivoEnviar.setText("Nome do Arquivo:");
	jLabelNomeArquivoEnviar.setBounds(new Rectangle(13, 58, 99, 16));
	
	panel.setSize(648, 169);
	panel.setLayout(null);
	panel.add(jLabelNomeArquivoEnviar, null);
	panel.add(getCaminhoArquivo(), null);
	panel.add(getJProgressBar(), null);
	panel.add(getImportar(), null);
	panel.add(getJButtonExibirLog(), null);
	panel.add(getJButtonRecuperarBackup(), null);
	panel.add(getAbrir(), null);
	panel.add(getJRadioButtonAtualizar(), null);
	panel.add(getJComboBoxRCS(), null);
	panel.add(getJRadioButtonInserir(), null);
	panel.add(jLabelInserir, null);
	panel.add(jLabelAtualizar, null);
	panel.add(getJFormattedTextFieldDtTarifa(), null);
	panel.add(jLabelInserirDataTarifa, null);
	panel.add(jLabelRC, null);		
	panel.add(jRadioButtonAbrirVigencia, null);
	panel.add(jRadioButtonFecharVigencia, null);		
	panel.setLayout(new BorderLayout());
	panel.setBorder(BorderFactory.createEmptyBorder(80, 570, 100, 80));

	ButtonGroup radios = new ButtonGroup();
	radios.add(jRadioButtonAbrirVigencia);
	radios.add(jRadioButtonFecharVigencia);
	jRadioButtonAbrirVigencia.setSelected(true);
	
	botaoSelecionarArquivo.setIcon(new ImageIcon(getClass().getResource(Campos.IMG_ABRIR)));
	botaoImportar.setIcon(new ImageIcon(getClass().getResource(Campos.IMG_ENVIAR)));
	//botaoCancelar.setIcon(new ImageIcon(getClass().getResource(Campos.IMG_SAIR)));
	botaoExibirLog.setIcon(new ImageIcon(getClass().getResource(Campos.IMG_DETALHES)));
	
	getJFrame();


	


	
	botaoImportar.addActionListener(new java.awt.event.ActionListener() {
		public void actionPerformed(ActionEvent evt)  {
			progressBar.setValue(0);
			if(validaCampos() == true){	
			Workbook workbook;
											  importacaoBOImpl.updateTempComodatoc(dataIniVigMenos1,dataTarifa2,listaTempComodatocVO);//fecha
														importacaoBOImpl.insertTempComodatoc(listaTempComodatocVO);//abre
														executaProcesso();
		
												
/**
 * This method initializes jProgressBar	
 * 	
 * @return javax.swing.JProgressBar	
 */
public JProgressBar getJProgressBar() {
	if (progressBar == null) {
		progressBar = new JProgressBar();
		progressBar.setMaximum(TAM_PROCESSO);
		progressBar.setStringPainted(true);
		progressBar.setBounds(new Rectangle(17, 92, 620, 14));
		pack();
		
		
	}
	return progressBar;
}



/**
 * Executa o processo da aplicação
 * @throws SQLException 
 * @throws AplicacaoException 
 * @throws InterruptedException 
 */
private void executaProcesso() throws AplicacaoException, SQLException, InterruptedException {
	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");
	}	
}
/**
 * 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
 */
public void update(Observable o, Object arg) {
	if(arg instanceof Integer) {
		getJProgressBar().setValue(((Integer) arg).intValue());
	} else if(arg instanceof Boolean) {
		//if( ((Boolean) arg).booleanValue() ) {
		getJProgressBar().setValue(1000);
		JOptionPane.showMessageDialog(null, "Processo de importação concluído com sucesso!", "Importação", JOptionPane.INFORMATION_MESSAGE);
		//}
}}

[code]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() {
	int i;
	for(i=0; i<= TelaPrincipal.TAM_PROCESSO; i++) {
		//Notifica o processamento a cada 10 iterações
		if((i % 10 == 0)) {
			notifyObservers(new Integer(i));
			setChanged();
		}
	}
	
	//Notifica fim do processo
	notifyObservers(new Boolean(true));
	setChanged(); 
}

[/code]

} // @jve:decl-index=0:visual-constraint=“5,9”
[/code]

Cuidado que o swing não é thread safe. Você não pode atualizar beans sem usar uma thread específica para isso. Pesquise sobre o swingworker.

http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

Dessa maneira você vai desincronizar as outras threads do seu programa.

Obrigada,!!!
Eu tenho um metodo que faz um insert no banco gigante e com isso a barra deve acompanhar o processo.
O SwingWorker comtempla isso?

[quote=monike]Obrigada,!!!
Eu tenho um metodo que faz um insert no banco gigante e com isso a barra deve acompanhar o processo.
O SwingWorker comtempla isso?

[/quote]

O swingworker é feito para atualizar beans por meio de threads. Todo componente visual deve ser atualizado por meio dele. Vai ver que a aplicação ganha até em desempenho.

Quando sua classe receber a indicação que o processo terminou, faça:

processo = null; 

O problema é que a variável nunca volta a ter o valor null, aí a thread não pode reiniciar nunca.

Pode ser na linha 134 do código que vc postou aqui.

Exatamente , eu tirei processo = null; e funcionou perfeitamente.Obrigada a tds!!!