JprogressBar + Observable

5 respostas
monike

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.

public class TelaPrincipal extends JFrame  implements ItemListener,Observer{
	
	
	public JProgressBar progressBar;
	public static int TAM_PROCESSO = [telefone removido];
	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(); 
	}

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

5 Respostas

J

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.

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?

J

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?

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.

ViniGodoy

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.

monike

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

Criado 9 de dezembro de 2010
Ultima resposta 10 de dez. de 2010
Respostas 5
Participantes 3