Gerar feedback gráfico da transmissão de dados via rede

Olá…

Tenho uma aplicação swing em Applet (JApplet) que se comunica com um servidor. Ela pode fazer upload e download de vídeos no servidor.

Eu preciso dar um feedbak visual para o meu usuário do processo da transmissão desses dados. Ou seja, preciso atualizar um JProgressBar com o valor de bytes enviados ou recebidos do servidor…

Ao meu ver, pareceu bem estranho fazer isso, pois separei totalmente a interface gráfica do processamento…Por enquanto fiz uma gambiarra, ao meu ver, pois me parece uma forma bastante estranha de contornar meu problema…Fiz o seguinte:
1-Na minha interface tenho um JProgressBar e um JLabel que devem ser atualizados conforme o processo de transmissão for se desenvolvendo.
2-Criei um objeto que é uma thread, que recebe essa JProgressBar e esse JLabel como parâmetros.
3-Fiz os métodos que recebem e que enviam dados para o servidor receberem como parâmetro esse objeto que é startado e ficaria, teoricamente, atualizando graficamente o andamento do processo nos componentes gráficos.

Essa thread que criei é assim:

public class ThreadProgressoTransmissao implements Runnable
{
    private JProgressBar barraDeProgresso;
    private JLabel rotuloProgresso;
    private int tamanhoTransmissao;
    private int tamanhoTransmitido;
    private boolean emExecucao;
    private int estado;
    
    private Thread thread;
    
    private static final int PARADO = 0;
    public static final int RECEBENDO_ARQUIVO = 1;
    public static final int ENVIANDO_ARQUIVO = 2;
    
    /** Creates a new instance of ThreadTempoSegmento */
    public ThreadProgressoTransmissao(JProgressBar barraDeProgresso,JLabel rotuloProgresso) 
    {
        this.barraDeProgresso = barraDeProgresso;
        this.rotuloProgresso = rotuloProgresso;
        this.thread = null;
        this.emExecucao = false;
        this.estado = PARADO;
    }
    
    public void inicia(int tamanhoTransmissao,int tipoDeTransmissao)
    {
        if(thread!=null)
        {
            this.para();
        }
        
        this.tamanhoTransmissao = tamanhoTransmissao;
        this.tamanhoTransmitido = 0;

       this.barraDeProgresso.setMaximum(tamanhoTransmissao);
       this.barraDeProgresso.setMinimum(0);
        
        if(tipoDeTransmissao==RECEBENDO_ARQUIVO)
        {
            this.rotuloProgresso.setText("Recebendo arquivo");
        }
        else
        {
            this.rotuloProgresso.setText("Enviando arquivo");
        }
        
        this.estado = tipoDeTransmissao;
        
        this.thread = new Thread(this);
        this.thread.start();
    }
    
    public void para()
    {
        this.emExecucao = false;
        this.barraDeProgresso.setValue(0);
        
        while(this.estado!=this.PARADO)
        {
        }
        
        thread = null;
    }
    
    public void setTamanhoTransmitido(int valor)
    {
        this.tamanhoTransmitido = valor;
    }
    
    public void run()
    {
        this.emExecucao = true;
        
        while(this.barraDeProgresso.getValue()<this.tamanhoTransmissao && emExecucao)
        {
            this.barraDeProgresso.setValue( tamanhoTransmitido );
            this.barraDeProgresso.repaint();
            this.barraDeProgresso.updateUI();
            System.out.println("Valor transmitido = "+tamanhoTransmitido+"");
            try
            {
                Thread.sleep(10);
            }
            catch(InterruptedException IE){}
                    
        }
        this.estado = this.PARADO;
        this.emExecucao = false;
        this.barraDeProgresso.setValue(0);
        this.rotuloProgresso.setText("");
        
        this.barraDeProgresso.repaint();
        this.barraDeProgresso.updateUI();
        this.rotuloProgresso.repaint();
        this.rotuloProgresso.updateUI();
    }
}

Os métodos que recebem/enviam dados chamam, a cada iteração (pois transmito em pacotes com tamanho definido), o método “setTamanhoTransmitido(int valor)”…

Todavia, graficamente nada acontece…

Tenho as seguintes dúvidas:
1 - Tem uma forma melhor e fazer isso?
2 - Será que o padrão Observable me ajudaria? Como?
3 - Mesmo sendo uma gambiarra, porque não funcionou? hehe

Valeu…

Ninguém?

Tente não usar “repaint” e “updateUI”. Alguém deve ter lhe dito que “updateUI” é parecido com o “DoEvents” do VB, mas ele não faz exatamente isso.

Em vez disso, você precisa procurar um exemplo de JProgressBar funcionando - estou sem um exemplo aqui.

O pior é que já usei JProgressBar antes…Já fiz funcionar em outras ocasiões…

Aqui, não sei porque ela não está respondendo…

E você saberia me explicar o que, exatamente, faz o updateUI()? Imaginei que ele realizasse a atualização gráfica imediata…

Estava até tentando ver se o padrão observer/observable poderia ser aplicado para solucionar este problema, mas até agora não consegui imaginar como…