Jump to content
Apaxe

JProgressBar para o ResultSet

Recommended Posts

Apaxe

Olá a todos!

Alguém aqui já criou uma JProgressBar que funciona-se perfeitamente "em paralelo" com a consulta que é efetuada à Base de Dados através do ResultSet?

Nos testes que aqui tenho feito, em Tabelas com muitos dados, a aplicação fica por momentos congelada até que o ResultSet obtenha todos os dados da tabela, e só após isto é que a barra da JProgressBar se move.

Tenho pesquisado muito na internet sobre este assunto mas ainda não vi nada funcional :-(

Agradecia ajudas.

Share this post


Link to post
Share on other sites
Baderous

Pesquisa por Swing Worker Threads. Esse caso da barra de progresso é um exemplo clássico de uso de worker threads.

Share this post


Link to post
Share on other sites
Apaxe

Criei o seguinte método através do SwingWorker, mas o seu modo de funcionamento continua a não ser o ideal, porque quando se procede à sua execução numa base de dados com muitos dados, a sua execução é a seguinte:

1º) Primeiro, a aplicação fica congelada até que o ResultSet processe os dados existentes na Base de Dados.

2º) No final, o progresso da jProgressBar acontece de uma forma instantânia ao mesmo tempo que os os dados são mostrados na Tabela.

O que eu pretendia era que a jProgressBar carrega-se em simultânio com o processamento do ResultSet, e só no final é que os dados eram mostrados na Tabela.

Deixo aqui o método que criei, para ver se alguém me consegue ajudar:

private void imprimeTabela() {

SwingWorker sw = new SwingWorker() {
@Override
protected Object doInBackground() {

try {

LigacaoBaseDados ligacaoBD = new LigacaoBaseDados();

Connection con = ligacaoBD.obterLigacao();

PreparedStatement pstmt;

ResultSet rs;


// String com o comando SQL:
String querySQL = "SELECT * FROM tb_socios ORDER BY id_socio ASC";

pstmt = con.prepareStatement(querySQL);

rs = pstmt.executeQuery();


DefaultTableModel tabelaModelo = (DefaultTableModel) jTable1.getModel();

tabelaModelo.setNumRows(0);

// Otém o numeros de linhas:
rs.last();
int rowsNo = rs.getRow();
rs.beforeFirst();
int rowsProcessed = 0;

while (rs.next()) {


// Imprime as linhas da Tabela "jTable1" com os valores recolhidos da base de dados:
tabelaModelo.addRow(new Object[]{
rs.getString("id_socio"),
rs.getString("nome_socio"),
rs.getString("numero_matricula")
});

// Incrementa a barra de progresso da jProgressBar1
rowsProcessed++;
int progress = rowsProcessed * 100 / rowsNo;
jProgressBar1.setValue(progress);

}


// Fecha as ligações:
rs.close();
pstmt.close();
ligacaoBD.fecharLigacao(con);


} catch (SQLException ex) {
System.err.println("Erro SQL: " + ex);
}//Fecha o TRY.

return null;
}

@Override
public void done(){
jProgressBar1.setValue(100);
}



};//Fecha o "SwingWorker".

// Start SwingWorker execution
sw.execute();


}//Fecha o Método

Edited by Baderous
geshi

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.