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