Threads + Barra de Progresso + iReport

4 respostas
J
Salve galera do forum... Por esses dias comecei a estudar como gerar relatórios com o iReport. Estudei vários tutoriais e consegui montar minha classe responsável por gerar meus relatórios sem problemas. Decide então colocar uma barra de progresso para que o usuário não tenha a impressão de que a aplicação estava travada. Procurei ler, e vi exemplos sobre o assunto. Percebi que tinha que fazer isso em duas threads, mas ai veio a dúvida. Nos exemplos que li, usa-se um loop como processo ([url]http://download.oracle.com/javase/tutorial/uiswing/components/progress.html[/url]). Ou seja, usa-se algo quantitativo para informar a bara que ela deve ser atualizada. Mas no caso da geração de um relatório, como informar a barra que eça deve ser atualizada???
//Exemplos genéricos que li
ínt processo = 0;
while(processo < 1000){
    if(processo % 10 == 0){
     
    //Notifique que a barra que ela deve ser atualizada!!!
    }
    processo++;
}

//No meu caso deve ser assim

while(meu_relatório_está_sendo_gerado){

   //Notique a barra que ela deve se manter na tela
   //Minha barra tem o atributo setIndeterminate(true);
   //então não precisa ser proporcianal ao tempo de geração do relatório
   //precisa-se apenas manter-se na tela enquanto isso

}

//Pronto! Agora que o relatório foi gerado, ela já pode sair

Como fazer isso?? Como notifica a barra de progresso que
ela deve manter na tela só enquanto o relatório é gerado???

Segue em anexo minhas classes.

Grato desde já! Abraços

Jonh

4 Respostas

S

Olá,

Eu resolvi este problema com as classes Observer e Observable do próprio JDK. Minha classe the faz o processamento é a Observable, e quando eu quero mandar uma informação para a minha classe que está Observando, eu uso o método notifyObservers(VALOR), passando o VALOR que eu quero atualizar (por exemplo, antes de começar eu digo que tem 519 tarefas a serem feitas. Quando completar 1, eu chamo o método informando que completei mais uma, e minha classe que está Observando simplesmente aumentar a barra.

A classe Observadora vai ter um método update (obrigatório) que é chamado sempre que o objeto que a classe está observando notifica os observadores. Dentro deste método, eu atualizo minha barra. Para isso, eu faço

view.getProgressBar().setValue(old++); view.paint(view.getGraphics());

O paint é para atualizar, porque estava tendo outros problemas.

Para usar estas classes, basta implementar java.util.Observer; na classe que vai observar, e java.util.Observable; na classe a ser observada.

Espero que tenha ajudado.

J

Ajudou sim, mas tenho uma pergunta,no link (http://www.guj.com.br/article.show.logic?id=47) diz assim:

public classeProcesso(Observer observador) { //Adiciona o objeto observador a lista de observadores addObserver(observador); //...outras inicializações }
No caso, minha classe observadora (a barra de progresso) é que tem ki ser passada como paramêtro pra
classe observada em seu construtor??

Grato

S
public class ClaseQueFazOProcessamento implements Observable {
 public void procedimento() {
  processamento
  ..
  ..
  while() {
   ..
   ..
   notifyObservers("mais um");
  }
 }
}

public class ProgressBar implements Observer {
 public void update() {
  barra.aumentarTamanho();
 }
}

Resumidamente é isso. Preste atenção nos argumentos que podem ser passados para poder modificar as informações.

J

Valeu pela dica. Vou estudar e ver como posso aplicar em meu caso!
Abraço

Criado 5 de setembro de 2010
Ultima resposta 5 de set. de 2010
Respostas 4
Participantes 2