JProgressBar só atualiza quando termina de executar o método

3 respostas
marcos4ft

Pessoal,

Estou tentando trabalhar com o JProgressBar, mas o programa só atualiza quando termina de processar.

Estou fazendo da seguinte forma

public class TelaPrincipal extends javax.swing.JFrame implements Runnable{

     public static Integer TOTAL;
.
.
.

public void carregaGrafo(List<JLabel[]> lista){
            TOTAL= 0;
            jBarra.setMaximum(100);
            jBarra.setMinimum(0);
            jBarra.setValue(0);
            jQuantSaltos.setText("0");
            grade.setModel(new TabelaDeGrafos(lista));
            
            FormatacaoDaTabela renderer = new FormatacaoDaTabela(); 
            grade.setDefaultRenderer(Object.class, renderer);
            grade.getColumnModel().getColumn(2).setCellRenderer(renderer);
            
            for(int i=0;i<grafo.getTotalDeColunas();i++){
                TOTAL++;
                grade.getColumnModel().getColumn(i).setPreferredWidth(24);
            }
            grade.getColumnModel().setColumnMargin(0);
            
            grade.setRowHeight(24);
    }


.
.
.

    public void run() {
        if (Thread.currentThread().getName().equals("carregaGrafo")){  
            jBarra.setValue(TOTAL);
            jBarra.setStringPainted(true);
        }
    }

}

e no método que chamo, to fazendo assim:

Thread t = new Thread(this);
           t.setName("carregaGrafo");
           t.start();
           carregaGrafo(listaDePecas);

Mas o jProgressBar só atualiza depois de ter carregado o grafo.
Ja usei varios exemplos aqui do forum, mas nenhum ta funcionando :cry:

3 Respostas

R

Você fez uma coisa correta e uma coisa errada. A coisa correta foi disparar uma thread em separado para seu processamento intensivo. A coisa errada foi, a partir dessa thread em separado, tentar atualizar a interface gráfica no contexto da própria thread em separado. A manipulação de componentes do Swing deve ser feita no contexto da própria thread do Swing. Dentro do seu método run(), todo código que manipula componentes do Swing deve ser executado através da construção abaixo:

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    // Seu código de manipulação de componentes do Swing aqui
  }});

Há uma discussão muito boa sobre isso no tutorial oficial:
http://download.oracle.com/javase/tutorial/uiswing/components/progress.html

fernandopaiva

veja isso:

http://www.guj.com.br/java/245786-jprogressbar-com-swingworker-

t+ e boa sorte

marcos4ft

roger_rf, vlw pela explicação. VOu dar uma olhada no link que você postou.

Consegui resolver meu problema com o que o fernandopaiva postou. vlw pessoal.

Criado 28 de setembro de 2011
Ultima resposta 28 de set. de 2011
Respostas 3
Participantes 3