Threads + Barra de Progresso + iReport

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 (http://download.oracle.com/javase/tutorial/uiswing/components/progress.html).
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???

[code]//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[/code]

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

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.

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

[code]public class ClaseQueFazOProcessamento implements Observable {
public void procedimento() {
processamento


while() {


notifyObservers(“mais um”);
}
}
}

public class ProgressBar implements Observer {
public void update() {
barra.aumentarTamanho();
}
}[/code]

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

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