JProgressBar com Thread

16 respostas
D

galera o negócio é o seguinte , eu queira usar um JprogressBar no decorrer de um backup , que ela carregasse a barra conforme o processo , eu andei vendo algo na net e parece que tem que pegar o tempo da Thread em processo , mais eu não tive muito sucesso , sera que alguem poderia me dar essa grande ajuda???

16 Respostas

cassio

Olá!

Na verdade não é que vc tenha que pegar o tempo da thread, o que vc precisa fazer é colocar uma thread separada para rodar o seu backup. Normalmente seu perograma em Swing roda com uma única thread para cuidar de tudo, o processament e a interface. Logo, quando vc executa uma tarefa muito longa, essa thread fica ocupada com esse processamento e não consegue atualizar a interface gráfica. Por isso a jProgressBar parece não funcionar.

Uma alternativa bem prática para isso é utilizar uma classe abstrata fornecida pela Sun chamada SwingWorker. Você só precisa pegar o arquivo .java dessa classe no site da Sun (é fácil, só digitar no google), colocar junto do seu projeto e usar. Você coloca ela dentro do evento do botão que dispara o seu backup, por exemplo. Vc precisa implementar dois métodos abstratos do SwingWorker, o construct() e o finalized(). Dentro do construct vc coloca a ação “demorada” do seu programa e… mágica! Essa parte estará rodando em um thread separada.
Na internet tem muitos exemplos de como usar a classe SwingWorker, é fácil :slight_smile:

Abraço!

D

cassio blz!!

vc não tem nem um exemplo pra mim dar uma olhada ???
é que eu nunca usei essa classe e to com algumas dúvidas…

cassio
seuBotao.addActionListener(new ActionListener() {				
				public void actionPerformed(ActionEvent arg0) {
					
					progressBar.setValue(0);
					SwingWorker worker = new SwingWorker(){
					
						public void finished() {							
							//coloque aqui tudo que vc quiser que seja feito
							//quando a ação dentro do método construct terminar...
						}
					
						public Object construct() {
							//coloque aqui dentro a ação demorada...
							return null;
						}					
					};					
					//inicialize o worker... significa chamar automaticamente
					//construct() e em seguida finalize()
					worker.start();
				}			
			});

Só não esqueça de pegar a classe no site da Sun!

D

cassio

deu certinho mew só que agora o meu ProgressBar não não executa , ele fica parado olha só como ta meu código

barraProcesso.setIndeterminate(true);
        SwingWorker worker = new SwingWorker(){
            
            public void finished() {
                //coloque aqui tudo que vc quiser que seja feito
                //quando a ação dentro do método construct terminar...
                barraProcesso.setIndeterminate(false);
                JOptionPane.showMessageDialog(null,"Terminou");
            }
            
            public Object construct() {
                //coloque aqui dentro a ação demorada...
                try{
                    new DBackupBancoPostgres("127.0.0.1","postgres",diretorioBackup +"\panificadora.backup" ,"panificadora");
                }catch(Exception ex){
                    //new EnviarEmail("Classe Backup \n Metodo backupActionPerformed() \n " + ex);
                    JOptionPane.showMessageDialog(null,ex);
                }
                return null;
            }
        };
        
        //inicialize o worker... significa chamar automaticamente
        //construct() e em seguida finalize()
        worker.start();
cassio

Das duas uma… ou vc faz setIndeterminate(true) ( e não false com vc fez, é o true que faz com que a barrinha comece a se mexer), ou se vc souber o “tamanho” da sua tarefa, ponha em um laço e vá redefinindo a posição da progress bar com setValue().

Abraço!

D

pois é , olhe no código que eu postei , na primeira linha … o meu
setIndeterminate está true , quando eu for para o metodo finished() eu defino como false , pra ele parar certo… , mais ele trava e não c move , a msg “Terminou” esta funcionando corretamente , apos ter terminado o backup ela é disparada…

e quanto a eu pegar o tempo que levara meu processo pra fazer com que a barra va carregando conforme o processo do backup , vc tem alguma sugestão de como eu pego esse tempo ???

abraços

cassio

Hum… é porque quando vc faz isso sua segunda thread acabou de morrer… heheeh

tente colocar a linha que faz setIndeterminate(false) logo após o bloco catch, antes do seu return null

:slight_smile:

cassio

Sobre como contar o tempo, depende… vc tem como saber “quanto” do seu back já foi feito, a qualquer momento?! Por exemplo, se vc tem que copiar as tabelas do seu BD, vc tem como contar quantas tabelas já foram copiadas até o momento? Eu pelo menos não sei fazer isso… hehehe

panificadora.backup é um script!?
Tvz dê para vc colocar algum contador ali dentro… Mas sei lá, acho que complica muito… acho que a principio, o tempo de um back de BD é indeterminado memso… eheheh
Mesmo se vc colocar para ir vendo o tempo que falta, acho q isso não refletiria a realidade, pois cada tabela tem um tamanho diferente…

D

afff cassio nd mew , eu coloco em tudo quanto é lugar , mais mesmo assim
a barrinha não corre, bom mais vou ver o que posso fazer aqui , muito obrigado mesmo pela sua ajuda , vlw

outra coisa , quando eu executo essa rotina uma vez blz , ela cria uma nova thread e enquando ela não terminar a execução ela não da a msg de “Terminou” , mais aew c eu for executar novamente a rotina , ela vai direto pra msg de “Terminou” , sabe o que pode ser??

cassio

Acho que pode ser alguma coisa relacionada com seu script de backup… Ele verifica a data do último backup feito ou algo do tipo? Sei la, parece que ele não está executando… ou não está executando por completo, abortando antes da hora…
Como é feito new no objeto SwingWorker toda vez que vc clica no botão, ele cria o objeto do zero, deveria funcionar sempre sem problemas…

O

acho que vc vai ter que utilizar o SwingClosure

barraProcesso.setIndeterminate(true); new SwingWorker() { public Object construct() { //coloque aqui dentro a ação demorada... try{ new DBackupBancoPostgres("127.0.0.1","postgres",diretorioBackup +"\panificadora.backup" ,"panificadora"); }catch(Exception ex){ //new EnviarEmail("Classe Backup \n Metodo backupActionPerformed() \n " + ex); JOptionPane.showMessageDialog(null,ex); } return null; } public void finished() { // This IS on the event-dispatching thread try { new SwingClosure(){ protected void run() { barraProcesso.setIndeterminate(false); } }.run(); JOptionPane.showMessageDialog(null,ex); } catch (ClosureException e) { // TODO } } }.start();

tanto o SwingWorker quanto o SwingClosure que eu utilizei é da oracle.
flw… abraço!

O

ops… na linha protect void run() {
muda para protect void runImpl() {

D

orenatim blz!!

essa SwingClosure é uma classe , como eu posso obter ela , aff to precisando urgente fazer isso , mew c vc puder me ajudar eu ficarei muito grato

O

olá…

bom… as classes SwingWorker e o SwingClosure que eu usei são da Oracle:

http://www.oracle.com/technology/products/jdev/esdk/api1013/oracle/ide/util/SwingWorker.html
http://www.oracle.com/technology/products/jdev/esdk/api1013/oracle/javatools/util/SwingClosure.html

no site da sun tem um exemplo parecido com o que o SwingClosure faz:
http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html#invokeLater

dá uma estudada que vai dar certo… agora nao posso olhar isso pra vc!!! :frowning:
ahh… e se vc der conta posta aí mostrando como vc fez.

desculpa aí a demora…

D

blz vou te mandar

admlaugusto

Opa!

por muito tempo procurei uma dica boa como esta de poder utilizar o SwingWork…
Parabéns pela solução

Aqui funfou blz

abraço

Criado 20 de outubro de 2006
Ultima resposta 2 de jun. de 2009
Respostas 16
Participantes 4