Problemas com Barra de Progresso!

Galera é o seguinte:
Tenho em minha aplicação Desktop um programa que faz a importação de produtos de uma tabela em para outra, até ai tudo bem faço um while ou um for até o final da tabela mais o que acontece é o seguinte. Queria eu colocar um barra de progresso no na minha aplicação para ficar uma coisa mais visual para o usuario. Uso o JProgressBar só que ele não apresenta o progresso. tipo fica sem ação e só no final ele me mostra já tudo carregado, alguém sabe como faço para ir mostrando o progresso de minha importação?

Este JProgressBar está sendo atualizado pela thread que faz a importação?
Esta thread precisa avisar à barra de progresso que houve progresso.
Outra solução é criar a barra em uma thread separada e esta consultar de tempos em tempos qual a nova situação.

Cara é o seguinte,

usar o jProgressBar é muito simples.
Primeiro você deve setar a quantidade de incrementos que o seu jProgressBar terá.

jProgressBar1.setMaximum((int)qtd);

Essa qtd de incrementos no seu caso deverá ser a quantidade de produtos, esse valor deve ser setado antes de entrar no while ou no for.

Após ter setado a quantidade de inclementos você deve começar a “preencher” seu progressBar.
Isso devera ser feito dentro de um loop, no seu caso dentro do while ou do for.
O incremento é feito da seguinte forma:

progressBar.setValue(progressBar.getValue()+1);

Como você viu na linha de código acima, eu estou incrementando o progressBar a partir da quantidade de incrementos que já forão feitos (progressBar.getValue()).
É isso ai, dessa forma você terá seu progressBar sendo preenchido gradativamente.
Espero ter ajudado.

Felipe.JavaMan fiz isso, só quando ele entra no loop o objeto de tela no caso o JProgressBar fica parado sem incrementação, aparecendo apenas no final do loop.

davidtiagoconceicao como faço para criar um thread separada da consulta? você algum exemplo?

Tem como você colocar o código que você esta usando, pois assim fica mais facil de vizualizar algum erro.

é maios ou menos assim:

[code]private void getImportaProdutos(String produto){
sql = “Select * From Table_Produto Where Codigo >=’”+Produto+"’ and Codigo <=’"+Produto+";
rs = ExecutaQuery(sql);
JPbar.setMaximum(500); //Digamos q tenho 500 Códigos.
JPbar.setMinimun(0);
try{
while(rs.next){
sql = “Update Nova_Table set valor=”+rs.getDouble(“Valor”)+" Where Produto=’"+rs.getString(“Codigo”)+"’";
ExecutaUpDate(sql);
JPbar.setValue(JPbar.getValue()+1);
}

if (JPbar.getValue()>0) {
JOptionPane.showMessage(null,"Importação Terminada","INFORMAÇÃO",JOptionPane.INFORMATION_MESSAGE;
}
}catch(SQLException SqlErro){
SqlErro.printStackTrace();
}
}[/code]

na linha 13 eu testo a condicção pra ver se o JPBar está com valor. E está. Só que na tela só aparece o progresso quando chega o fim do loop.

Usa SwingWorker

http://java.sun.com/docs/books/tutorial/uiswing/concurrency/worker.html

E para ficar atualizando o progressbar, vc pode usar isso

http://java.sun.com/docs/books/tutorial/uiswing/concurrency/interim.html

Fabiofalci desculpe pela minha iguinorância, mais não entendi como usar? você tem algum exemplo mais simples?

E ai cara, conseguiu resolver o seu problema?
Caso não tenha conseguido eu te proponho outra solução.

Seu código não esta se comportando da forma esperada porque quando você incrementa o progressBar, o componente não é atualizado na tela, certo?
Então, para você atualizar o JFrame e assim o progressBar ser preenchido gradativamente, você pode fazer uma chamada a um método que atualizaria os componentes ao estado atual:
Isso pode ser feito da seguinte forma:


public void rePaint(){
  paintComponents(this.getGraphics());
} 



 private void getImportaProdutos(String produto){  
 sql = "Select * From Table_Produto Where Codigo >='"+Produto+"' and Codigo <='"+Produto+";  
 rs = ExecutaQuery(sql);  
 JPbar.setMaximum(500); //Digamos q tenho 500 Códigos.  
 JPbar.setMinimun(0);  
 try{  
    while(rs.next){  
      sql = "Update Nova_Table set  valor="+rs.getDouble("Valor")+" Where Produto='"+rs.getString("Codigo")+"'";  
      ExecutaUpDate(sql);  
      JPbar.setValue(JPbar.getValue()+1);   

  rePaint(); // método que dá um refresh no JFrame

    }  
    
    if (JPbar.getValue()>0) {    
        JOptionPane.showMessage(null,"Importação Terminada","INFORMAÇÃO",JOptionPane.INFORMATION_MESSAGE;  
      }  
   }catch(SQLException SqlErro){  
      SqlErro.printStackTrace();  
 }  
  }  

Existe uma forma melhor do que essa, que atualiza apenas a componente que você deseja, dai é só vc pesquisar, pq eu não sei.
Acredito que exista outras soluções melhores do que esta para fazer o que você esta querendo, caso você encontre por favor post aqui.

Estudem bem SwingWorker e olha o exemplo desse link:
http://java.sun.com/docs/books/tutorial/uiswing/concurrency/interim.html

A ideia eh ter um processo que faz alguma coisa longe da EDT pra não congelar a tela e então usar o tal SwingWorker.publish
pra ir atualizando o progress bar, este sim no EDT. Não e coisa básica de se fazer, mas estude ali e tente :wink: