Relatorio com SwingWorker

1 resposta
A

oi estou tendando gerar um relatorio pelo irreport na minha aplicação de java e tenho 3 perguntas referente ao codigo abaixo

metodo que gera o relatorio

public JasperPrint gerar() { JasperPrint rel = null; try { HashMap map = new HashMap(); String arquivoJasper = "relatorio.jasper"; rel = JasperFillManager.fillReport(arquivoJasper,map,conexao); } catch (JRException e) { System.out.println(e.getMessage()); //JOptionPane.showMessageDialog(null,e.getMessage()); } return rel; }

parte da classe principal onde manda gerar o relatorio

final SwingWorker worker = new SwingWorker<Void, Integer>() {
            protected Void doInBackground() throws Exception {
                barraProgresso.setValue(0);
                JasperPrint relat;
                barraProgresso.setValue(50);
                relat = p.gerar();
                barraProgresso.setValue(100);
                JasperViewer.viewReport(relat, false);
                frameProgresso.setVisible(false);
                return null;
            }
      };

1ªcolocar em um SwingWorker ou em uma Thread afeta o rendimento da minha aplicação qual dos 2 é o melhor
2ªconsigo botar dentro de um metodo ou classe a parte que gera o relatorio que testa repetidamente ate o fim do processo e a porcentagem feita ou o unico geito seria o escrito ai em cima
3ªcomo eu passo parametros para meo relatorio para por exemplo fazer uma busca de um determinado periodo no meo banco de dados

1 Resposta

G

Olá, estou respondendo sua duvida numero 1:

Se este código estiver dentro de uma aplicação desktop (swing) de fato SwingWorker é o ideal.
Lembrando que o SwingWorker é uma forma de efetuar operações demoradas em segundo plano de modo a não afetar o desempenho (congelar) da interface gráfica.

O que eu sugiro é que a linha abaixo seja chamada fora do SwingWorker, pois em segundo plano você gera o relatório e depois volta para o fluxo principal para mostrá-lo

JasperViewer.viewReport(relat, false);

Ficaria mais ou menos assim:

final SwingWorker<JasperPrint, Integer> worker = new SwingWorker<JasperPrint, Integer>() {  
   protected JasperPrint doInBackground() throws Exception {  
      barraProgresso.setValue(0);  
      JasperPrint relat;  
      barraProgresso.setValue(50);  
      relat = p.gerar();  
      barraProgresso.setValue(100);  
      frameProgresso.setVisible(false);  
      return relat;  
   }
};
//Executa a geracao do relatorio em background
worker.execute();
//Ele espera o relatorio ser gerado para continuar o processo
JasperPrint relatorioGerado = worker.get();
//Agora mostra o relatorio gerado
JasperViewer.viewReport(relatorioGerado, false);

Att

Criado 9 de outubro de 2008
Ultima resposta 9 de out. de 2008
Respostas 1
Participantes 2