Status de processamento - JProgressBar

10 respostas
RichardVaugh

Pessoal, boa tarde !

Estou tentando fazer uma barra de progresso mas não estou tendo sucesso.
Tentei exibir uma janela com uma jprogressbar mas ela só aparece depois que processou as informações, mesmo se colocar a abertura do frame
antes do processamento.
Tentei com threads e não consegui também (não atualiza a janela).
Tentei colocar um componente na tela e também ficou congelada enquanto processava.

Enfim, tentei de várias formas.
Estou com JDK 1.5 (falo isso porque procurei e encontrei uma forma nos tutoriais da Sun mas eu só poderia implementar com jdk 1.6)

Por favor, alguém tem um exemplo ?

obrigado !

10 Respostas

rodrigo.bossini

http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html
Edit: Verdade, swingworker começou com a versão 6. Mas porque não usar a versão 6?

RichardVaugh

Não tenho tempo pra mudar todo o layout das telas, que fiz com o 1.5.

Alguma sugestão ?

rodrigo.bossini
Acho que isso aqui já ajuda:
import javax.swing.*;
import java.util.*;
public class Test extends JFrame{

		public static void main (String [] args){
			Test test = new Test();
			Test.AtualizaTela atualizador = test.new AtualizaTela();
			Test.GeraNumero gera = test.new GeraNumero();
			Thread t1 = new Thread (atualizador);
			Thread t2 = new Thread (gera);
			
			t2.start();
			t1.start();
		}	

	
	class AtualizaTela implements Runnable{
		public void run (){
			while (bar.getValue () < 100000){
				bar.setValue (bar.getValue () + numero);
				Thread.yield();
			}
			System.out.print ("fim atualiza"); //usei só pra testes	
		}
	}
	class GeraNumero implements Runnable {
		public void run (){
			while (bar.getValue () < 100000){
				numero = gerador.nextInt (2);
				Thread.yield();
			}
		}
	}

	public Test(){
		bar = new JProgressBar(0,100000);
		gerador = new Random ();
		numero = 0;
		this.add (bar);
		this.pack();
		this.setVisible (true);
		this.setDefaultCloseOperation (this.EXIT_ON_CLOSE);
	}	

	
	JProgressBar bar;
	Random gerador;
	int numero;
}

Ainda tá faltando sincronizar as threads, obviamente você não pode simplesmente confiar no comportamento do yield.

RichardVaugh

Legal o exemplo, vou fazer uns testes aqui.
Obrigado !

rodrigo.bossini

RichardVaugh:
Legal o exemplo, vou fazer uns testes aqui.
Obrigado !

Depois nos conte se serviu para o que vc precisava e poste possíveis melhoramentos que vc fizer!

Abraço!

E

como funciona JProgressBar?
o tempo é determindo pelo programador?
porque o tempo de atualização do sistema ou um backup depende da velocidade da máquina.
como seria esse gerenciamento de tempo? para que a barra nao termine antes do processo.

D

Pelo que entendi de sua dúvida. O único modo de atualizar a barra de progresso e fazer uma tarefa ao mesmo tempo é com o uso de Threads.

Sem uso de Threads sempre a barra de progresso irá atualizar toda de vez no fim.

Crie uma classe que implemente a interface Runnable e use uma Thread. Ou então crie uma classe que herde da classe Thread.

Já testei implementando Runnable e tudo ocorreu corretamente. Barra de progresso atualizando concorrentemente com um método para cópia de um arquivo.

Espero que tenha ajudado.

Vlw

root_

SE VC TIVER FAZENDO ALGO, COMO POR EXEMPLO:

int x = 5000;
for(int i=0; i<x; i++)
 {
       progress = (100*(i+1))/x;
       jProgressBar1.setValue(progress);
      // a Manha ta aki logo abaixo.
      jProgressBar1.getUI().update(jProgressBar1.getGraphics(), jProgressBar1);
      Thread.sleep(250);
}

Sem usar THREADS… apenas use: jProgressBar1.getUI().update(jProgressBar1.getGraphics(), jProgressBar1); q ta tudo ok!
Espero ter ajudado… pois ja precisei muito do jProgress de forma simples, pratica e rapida!

rodrigo.bossini

root_:
SE VC TIVER FAZENDO ALGO, COMO POR EXEMPLO:

int x = 5000;
for(int i=0; i<x; i++)
 {
       progress = (100*(i+1))/x;
       jProgressBar1.setValue(progress);
      // a Manha ta aki logo abaixo.
      jProgressBar1.getUI().update(jProgressBar1.getGraphics(), jProgressBar1);
      Thread.sleep(250);
}

Sem usar THREADS… apenas use: jProgressBar1.getUI().update(jProgressBar1.getGraphics(), jProgressBar1); q ta tudo ok!
Espero ter ajudado… pois ja precisei muito do jProgress de forma simples, pratica e rapida!

Legal, dessa não sabia. Sempre que precisei de uma progress bar, utilizei a classe SwingWorker do java 6 pra fazer o processamento.

altitdb

root_:
SE VC TIVER FAZENDO ALGO, COMO POR EXEMPLO:

int x = 5000;
for(int i=0; i<x; i++)
 {
       progress = (100*(i+1))/x;
       jProgressBar1.setValue(progress);
      // a Manha ta aki logo abaixo.
      jProgressBar1.getUI().update(jProgressBar1.getGraphics(), jProgressBar1);
      Thread.sleep(250);
}

Sem usar THREADS… apenas use: jProgressBar1.getUI().update(jProgressBar1.getGraphics(), jProgressBar1); q ta tudo ok!
Espero ter ajudado… pois ja precisei muito do jProgress de forma simples, pratica e rapida!

Desse seu jeito muito mais facil, valeu cara!!
Tava me matando com as Threads aqui!!

xD~~

Criado 22 de março de 2009
Ultima resposta 21 de abr. de 2010
Respostas 10
Participantes 6