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???
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
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??