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???
JProgressBar com Thread
16 Respostas
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 
Abraço!
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…
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!
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();
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!
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
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

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…
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??
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…
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!
ops… na linha protect void run() {
muda para protect void runImpl() {
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
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!!! 
ahh… e se vc der conta posta aí mostrando como vc fez.
desculpa aí a demora…
blz vou te mandar
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