Olá pessoal, estou precisando de uma dica de como implementar uma interação enquanto esta gerando um relatorio jasper. É pq mando gerar o relatorio e nao aparece nada na tela enquanto esta processando o relatorio, e tem aque aparecer alguma informacao pro usuário né, tipo uma barra de progresso, um jprogressbar. Alguém tem uma idéia a respeito? Obrigado!
E ai pessoal, ninguém tem uma dica, um caminho…? Obrigado!
Eu só chamo a geração/apresentação de um relatório dentro de uma Thread. E ai implemento no início da Thread uma progressbar pra comecar a rodar, e antes da Thread terminar eu paro essa progressbar. Não tem como eu calcular qto tempo vai levar pro relatório ficar pronto, então deixo a progressbar rodando de lá pra cá… pelo menos fica se mexendo e o usuário entende que não está travado.
Olá Renata! Eh, todos falam desse problema de nao ter como calcular o tempo… entao pensei em implementar algo do tipo que vc usa, ou seja, coloca um progressbar indeterminado enquanto gera o rel, e pelo que andei pesquisando precisa-se colocar uma Thread para a progressbar e outra pra gerar o relatorio, é assim que vc usa? Eu ainda nao estudei a fundo sobre threads, vou fazer isso. Vc pode postar um exemplo? seria de grande ajuda. Obrigado!
Bem, tenho certeza que pra começar vc vai precisar estudar Threads msm… não se preocupe, não é nada complicado. Abaixo um pequeno exemplo de como eu uso:
Thread que chama o relatório:
[code]public class ThreadRelatorio implements Runnable {
public ThreadRelatorio(){}
public void run() {
// aqui eu inicio a progressbar
try{
// aqui eu gero e apresento meu relatório
}catch(Exception e){
// aqui eu faço o tratamento de qq exception que ocorra
}finally{
// aqui eu paro a progressbar
}
return;
}
}
[/code]
Para a progressbar preciso de um componente JProgressBar na tela, e uso um JLabel do lado dele tb, para colocar uma msg.
Ai, para iniciar a progressbar faço assim:
[code] SwingUtilities.invokeLater(new Runnable() {
public void run(){
meulabel.setVisible(true);
meulabel.setEnabled(true);
meulabel.setText(“Esta é a mensagem que deve aparecer…”); // coloco a msg que aparecerá no label
meuprogressbar.setVisible(true);
meuprogressbar.setEnabled(true);
meuprogressbar.setIndeterminate(true); // isso deixa sua barra indo pra lá e pra cá, sem ter um tempo
meuprogressbar.setMinimum(0);
meuprogressbar.repaint();
}
});
[/code]
Se por acaso, em outro lugar, vc quiser usar a progressbar com limite, progredindo certinho, vc faz assim:
SwingUtilities.invokeLater(new Runnable() {
public void run(){
meuprogressbar.setIndeterminate(false);
meuprogressbar.setMinimum(0); // o mínimo será 0
meuprogressbar.setMaximum(100); // o máximo será 100, vc pode por aqui o valor que quiser
meuprogressbar.setStringPainted(true);
meuprogressbar.setValue(0);
meuprogressbar.repaint();
}
});
E ai, a cada vez que quiser que a progressbar mude a progressão na barra, vc faz assim:
SwingUtilities.invokeLater(new Runnable() {
public void run(){
meuprogressbar.setValue(50); // mandei pra posição 50, no nosso caso, seria metade da barra
}
});
Para parar a barra (independente se vc está usando ela como indeterminada ou com valores certinho), vc faz assim:
SwingUtilities.invokeLater(new Runnable() {
public void run(){
meuprogressbar.setIndeterminate(true);
meuprogressbar.setMinimum(0);
meuprogressbar.setMaximum(0);
meuprogressbar.setStringPainted(false);
meuprogressbar.setValue(0);
meuprogressbar.repaint();
}
});
Bom, claro que não fico colocando todo esse código nos meus fontes em todos os lugares.
Criei uma classe, chamo isso através de métodos, tudo direitnho.
Então, agora que já te dei o “caminho das pedras”, pesquise sobre JProgressBar e Threads, monte sua classe e deixei tudo direitinho ai hein!
Boa sorte!
T+, []'s