[Dúvida] Threads e Interface Gráfica

4 respostas
pdf_karioka

Bom, estou desenvolvendo um projeto na faculdade e em determinado momento eu carrego em um banco de dados dados armazenados em um arquivo.
Eu tentei desenvolver uma interface gráfica para o programa ficar mais intuitivo, e foi aí que surgiu meu problema.

Aqui vai uma imagem de como fica minha janela:

Dentro do código da janela (criada pelo assistente de janela do Netbeans), eu crio uma instância da classe DBUploader (a responsável pela conexão com o banco, carregamento dos arquivos e tudo mais).

Eu criei um evento para quando eu clicar no botão Upload o programa começar a carregar os dados no banco de dados. Enquanto o programa carrega os dados, eu queria que a minha ProgressBar ficasse no modo indeterminado.

Eu tentei fazer assim:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { Cursor cursor = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR); this.setCursor(cursor); jProgressBar1.setIndeterminate(true); String versionNumber = null; String console = null; boolean eraseDB = false; if (!jTextField1.getText().isEmpty()) { try { versionNumber = jTextField1.getText(); if (jRadioButton1.isSelected()) { eraseDB = true; } else { eraseDB = false; } DBUploader up = new DBUploader(versionNumber, eraseDB); console = up.loadRdf(up.getTargetFile(), up.getEBayVersionName(), eraseDB); jTextArea1.setText(console); console += up.loadRdf(up.getSourceFile(), up.getSourceVersionName(), false); jTextArea1.setText(console); console += up.loadMatchingReferences(up.getMatchingFile(), true); jTextArea1.setText(console); console += "--------------------------------------------------\n" + "Pronto!\n" + "--------------------------------------------------\n"; jTextArea1.setText(console); cursor = Cursor.getDefaultCursor(); this.setCursor(cursor); jProgressBar1.setIndeterminate(false); } catch (Exception e) { JOptionPane.showMessageDialog(this, "Erro de Execução!"); System.exit(0); } } else { JOptionPane.showMessageDialog(this, "Erro de Execução!"); System.exit(0); } }
Mas quando eu clico no botão Upload, a minha janela fica “congelada” enquanto o programa carrega os dados. Eu até consegui colocar para o cursor do mouse ficar como ampulheta, mas só isso. A minha janela fica "congelada’ até o fim da execução dos métodos do DBUploader.

Gostaria de saber se é possível fazer o que eu quero e qual é a melhor forma para isso. Pesquisando um pouco ouvi falar sobre threads e gostaria de saber se realmente é o único jeito. Se for eu aproveito pra estudar threads.

Desculpem se eu estou postando no lugar errado, mas não encontrei nenhum post sobre esse assunto, e acho que é uma dúvida muito específica! Obrigado desde já pela atenção!

4 Respostas

fabiofalci

Tudo o que você precisa saber: http://download.oracle.com/javase/tutorial/uiswing/concurrency/

pdf_karioka

Obrigado fabiofalci, vou dar uma lida e qualquer dúvida eu posto nesse tópico mesmo. Valeu!

ViniGodoy

Veja também esse exemplo:

E os dois da página seguinte.

Se essa classe DBUploader for sua, é uma ótima idéia faze-la disparar eventos de progresso, e atualizar sua ProgressBar corretamente. A tolerância do usuário fica bem maior quando a barra indica um progresso real.

pdf_karioka

Obriga ViniGodoy pela ajuda.

Eu consegui fazer o que eu pretendia! Vou dar uma olhada agora nesses eventos de progresso para melhorar o programa!

Abração para os dois que me ajudaram! Valeu!

Criado 3 de março de 2011
Ultima resposta 3 de mar. de 2011
Respostas 4
Participantes 3