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…