Já testei com o SwingUtilies também, mas o processo de pegar o JasperPrint e mostrar com o JasperViewer trava a minha tela e não mostra a barra. O estranho é que com os outros LAFs padrão do JDK rodam normalmente.
Método que cria a Thread para executar o relatório.
[code] private void executaRelatorio(){
ValidaDatasPorTipoDeRelatorio valida = new ValidaDatasPorTipoDeRelatorio();
if (valida.validarRelatorioTotalDePassageiroPorLinha(txtDataInicio.getDate(), txtDataFim.getDate()) == true) {
if (processarRelatorio == null) {
String DATA_INICIO = new SimpleDateFormat("yyyy-MM-dd").format(txtDataInicio.getDate());
String DATA_FIM = new SimpleDateFormat("yyyy-MM-dd").format(txtDataFim.getDate());
processarRelatorio = new Thread(new RelatorioProcesso(this, DATA_INICIO, DATA_FIM));
processarRelatorio.start();
} else {
JOptionPane.showMessageDialog(this, "Outro relatório já está sendo gerado.");
}
}
}[/code]
Método que atualiza a barra de progresso que recebe Observable como parâmetro.
public void update(Observable o, Object arg) {
if (arg.toString().equals("1")){
progressBarRelatorio.setVisible(true);
progressBarRelatorio.setIndeterminate(true);
progressBarRelatorio.setString("Gerando relatório...");
progressBarRelatorio.setStringPainted(true);
} else {
progressBarRelatorio.setVisible(false);
progressBarRelatorio.setIndeterminate(false);
progressBarRelatorio.setString(null);
progressBarRelatorio.setStringPainted(false);
processarRelatorio = null;
}
}
A classe que que faz o processo de chamar o relatório.
[code] private class RelatorioProcesso extends Observable implements Runnable {
private String DATA_INICIO = null;
private String DATA_FIM = null;
/**
* Construtor
* @param observador é a classe a ser observada.
*/
public RelatorioProcesso(Observer observador, String DATA_INICIO, String DATA_FIM) {
addObserver(observador);
this.DATA_INICIO = DATA_INICIO;
this.DATA_FIM = DATA_FIM;
}
public void run() {
setChanged();
notifyObservers("1");
emite();
setChanged();
notifyObservers("");
}
private void emite() {
EmiteRelatorios emitirRelatorio = new EmiteRelatorios();
emitirRelatorio.RelatorioTotalDePassageiroPorLinha(DATA_INICIO, DATA_FIM);
}
}[/code]
E a minha classe com o relatório.
[code]public class EmiteRelatorios {
/**
* Gera o relatório de Total de Passageiro por Linha.
* @param DATA_INICIO É a data inicial do período do relatório.
* @param DATA_FIM É a data final do período do relatório.
*/
public void RelatorioTotalDePassageiroPorLinha(final String DATA_INICIO, final String DATA_FIM){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Session sessao = null;
InputStream relatorio = null, IMAGEM_INICIO = null;
try {
relatorio = getClass().getResourceAsStream("/br/com/tecnicgvbus/relatorios/jaspers/PassageiroTotalLinha.jasper");
IMAGEM_INICIO = getClass().getResourceAsStream("/br/com/tecnicgvbus/imagens/Relatorio.jpg");
sessao = HibernateUtil.getSessionFactory().openSession();
HashMap parametros = new HashMap();
parametros.put("DATA_INICIO", DATA_INICIO);
parametros.put("DATA_FIM", DATA_FIM);
parametros.put("IMAGEM_INICIO", IMAGEM_INICIO);
JasperPrint jPrint = JasperFillManager.fillReport(relatorio, parametros, sessao.connection());
JasperViewer jView = new JasperViewer(jPrint, false);
jView.setSize(1024, 768);
jView.setTitle("Relatório de Passageiros por Linha");
jView.setExtendedState(JFrame.MAXIMIZED_BOTH);
jView.setVisible(true);
sessao.close();
} catch (Exception e) {
System.out.println(e);
JOptionPane.showMessageDialog(InicioView.getInicioView(), "Erro ao gerar relatório.\n\nErro:\n" + e + "\n\nContate o administrador do sistema");
} finally {
try {
if (sessao.isOpen()) {
sessao.close();
}
relatorio.close();
} catch (Exception e) {/*discard it*/
}
}
}
});
}
}[/code]
O problema está na linha 25 da classe EmiteRelatorios quando ele chama o JasperViewer, note que já estou utilizando o SwingUtilies, mas mesmo assim ele trava a minha tela. Porém se eu colocar algum dos LAFs padrão do JDK ele não trava a tela…
Será que realmente isso é assim somente por causa do substance?