Apaxe Posted September 14, 2013 at 07:34 PM Report #524574 Posted September 14, 2013 at 07:34 PM 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.
Baderous Posted September 22, 2013 at 03:34 PM Report #525483 Posted September 22, 2013 at 03:34 PM Pesquisa por Swing Worker Threads. Esse caso da barra de progresso é um exemplo clássico de uso de worker threads.
Apaxe Posted September 23, 2013 at 09:49 AM Author Report #525523 Posted September 23, 2013 at 09:49 AM Baderous, obrigado pela dica. Descobri este fórum em inglês, que tem uma solução de como utilizar o SwingWorker com o ResultSet e o jProgressBar. Vou ver se obtenho o que pretendo... http://stackoverflow.com/questions/17772562/jprogressbar-sql-query/18768267#18768267
Apaxe Posted September 23, 2013 at 12:37 PM Author Report #525548 Posted September 23, 2013 at 12:37 PM (edited) 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 September 23, 2013 at 10:25 PM by Baderous geshi
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now