[Resolvido] JasperViewer Fecha a Aplicação

Estava aprendendo a gerar relatorios com o iReport e JasperReport, ate ai tudo bem, então resolvi fazer um teste, criei uma classe main só com um JFrame e um botão que chama outra classe responsavel por gera e mostrar o relatorio. Funcionou, o problema é que quando eu fecho o relatorio ele tambem fecha a classe main e finaliza a aplicação. Alguem tem ideia do que eu estou fazendo errado !?!? ou o JasperViewer funciona assim mesmo!?!?!?

Metodo Main

[code]package relatorios;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.jasperreports.engine.JRException;

public class main extends javax.swing.JFrame {

public main() {
    initComponents();
    setExtendedState(MAXIMIZED_BOTH);
    ButtonHandler bh = new ButtonHandler();
    btnPdf.addActionListener(bh);
}

private void initComponents() {

    jFrame1 = new javax.swing.JFrame();
    btnPdf = new javax.swing.JButton();

    javax.swing.GroupLayout jFrame1Layout = new javax.swing.GroupLayout(jFrame1.getContentPane());
    jFrame1.getContentPane().setLayout(jFrame1Layout);
    jFrame1Layout.setHorizontalGroup(
        jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    jFrame1Layout.setVerticalGroup(
        jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
    );

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    btnPdf.setText("PDF");
    btnPdf.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            btnPdfActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addComponent(btnPdf, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(611, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addComponent(btnPdf)
            .addContainerGap(371, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>
private void btnPdfActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:

}

class ButtonHandler implements ActionListener {

    public void actionPerformed(ActionEvent ae) {
        if (ae.getSource() == btnPdf) {
            try {
                RelatorioBibliotecaPessoal rel = new RelatorioBibliotecaPessoal();
                rel.geraRelatorio();
            } catch (JRException ex) {
                Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

public static void main(String args[]){
    //main main = new main();
    new main().setVisible(true);

}
// Variables declaration - do not modify
private javax.swing.JButton btnPdf;
private javax.swing.JFrame jFrame1;
// End of variables declaration

}
[/code]

Boa tarde,

precisaria do codigo onde vc esta chamando o jasper… mas acho q onde vc esta chamando mesmo (dentro do geraRelatorio() que esta na outra classe sua), deve estar desta forma:


   JasperViewer.viewReport(jpt, true);
   

esperimente mudar para


   JasperViewer.viewReport(jpt, false);
   

isso fica onde vc faz mesmo a chamada para apresentar o relatorio… onde apresenta ele mesmo…

1 curtida

A minha outra classe esta assim:

[code]package relatorios;

imports …

public class RelatorioBibliotecaPessoal {

 private static Connection getConnection() throws ClassNotFoundException, SQLException {
             ...
}


public void geraRelatorio() throws JRException, Exception {
	Connection con = getConnection();
	Statement stm = con.createStatement();
	String query = "select * from contatos";
	ResultSet rs = stm.executeQuery(query);
	
	JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
	
	Map parameters = new HashMap();
	
	JasperFillManager.fillReportToFile("RelatorioBibliotecaPessoal.jasper", parameters, jrRS);
	
	JasperExportManager.exportReportToPdfFile("RelatorioBibliotecaPessoal.jrprint");
			 
	JasperRunManager.runReportToPdfFile("RelatorioBibliotecaPessoal.jasper",parameters, jrRS);
	
	JasperViewer.viewReport("RelatorioBibliotecaPessoal.jrprint",false);
}

}[/code]

Desde ja Agradeço.

Ola novamente,

Entao… segundo a documentacao

http://jasperreports.sourceforge.net/api/net/sf/jasperreports/view/JasperViewer.html

utilizando desta forma

JasperViewer.viewReport("RelatorioBibliotecaPessoal.jrprint",false); 

vc esta chamando o metodo:

viewReport(java.lang.String sourceFile, boolean isXMLFile)

por este motivo esta fechando a sua aplicacao… o certo seria utilizar o

viewReport(JasperPrint jasperPrint, boolean isExitOnClose)

        JasperPrint jpt = JasperFillManager.fillReport("RelatorioBibliotecaPessoal.jasper", parameters, jrRS);
        JasperViewer.viewReport(jpt, false);

Um abraço

Ai Carlos, valeu pela ajuda, realmente funcionou, ao fecha o viewer a aplicação não facha, mas meu relatorio esta saindo em branco, acho que tem a ver com o parameter, mas eu não sei como usa-lo, sem querer abusar mas se vc puder me dar mais esse help eu ficaria grato. Abraços.

Achei que tinha conseguido, mas ainda não.

Agora deu certo, ficou assim:

[code]

public void geraRelatorio() throws JRException, Exception {
	Connection con = getConnection();
	Statement stm = con.createStatement();
	String query = "select * from contatos";
	ResultSet rs = stm.executeQuery(query);
	
	JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
	
	Map parameters = new HashMap();					
	
	JasperExportManager.exportReportToPdfFile("RelatorioBibliotecaPessoal.jrprint");					 
	 
	JasperPrint jpt = JasperFillManager.fillReport("RelatorioBibliotecaPessoal.jasper", parameters, jrRS);  

	JasperViewer.viewReport(jpt, false);
}

}[/code]

Valeu a ajuda Carlos.

Tipo, não tem o que fazer… eh esse o metodo mesmo q eu te passei q vc deve utilizar, tem outros pra determinar se ele fechara ou nao o programa… mas nenhum com String como parametro… tipo vc sabe q o valor padrao de um Frame eh ao fechar, Exit on close. o o jasperview puxa isso do frame, por isso temos q definir.

Sobre a ajuda, posso sim… seguinte

No exemplo q eu passei ali
eu errei =X
tipo eu ali no exemplo ao inves de pasar um JRResultSetDataSource estou passando um Connection…
soh copiei o seu codigo.
no seu caso vc poderia manter o codigo inicial…

JasperViewer.viewReport("RelatorioBibliotecaPessoal.jrprint",false);   

porem… acrecentando mais um false

JasperViewer.viewReport("RelatorioBibliotecaPessoal.jrprint",false,false);   

desta forma utilizaria o metodo:

static void viewReport(java.lang.String sourceFile, boolean isXMLFile, boolean isExitOnClose)

Agarra no terço q agora vai da certo…

um abraco

Bom agora vc tem as duas maneiras…

Vc escolhe qual eh a melhor pra aplicaçao

Qualquer coisa eh soh postar VLWW

Abracos

E se eu utilizar um select mais complexo, tipo formatando valores e datas, como poderei proceder no IReport?

O código que estou usando na aplicação é esse:

SELECT CodGado, REPLACE(SUM(REPLACE(preco, ',' , '.')), '.', ',') 'Preco R$', " + " REPLACE(SUM(REPLACE(qlitros, ',', '.')), '.', ',') 'Litros diarios', "+ "date_format(dataproducao, '%d-%m-%y') 'Data de Producao' " + "FROM producaoleite GROUP BY dataproducao

Implementei este tipo de select, pois estou utilizando uma tabela que é
gerada a partir da quantidade de dados que possui no banco, por isso preciso jogá-lo dentro do IReport custe o que custar.

Alguém sabe se isso é possível?

Obrigado.

Nao tenho certeza mais acredito que vc deveria fazer os formatos no IReports e entao passar os dados para ele…
Da uma olhada na documentacao.

Outra coisa… esse topico ja esta marcado como resolvido, acho q deveria procurar um aberto ou abrir um outro…

Acabei pegando no susto seu post
FOUhAEFOuhAEFUOhae

abracos…

E está resolvido mesmo, porque eu já resolvi também. :smiley:

O IReport não aceita $ (cifrões) nos relatórios, não importa se é no título ou nas linhas.
Bastava eu retirar o cifrão do título da coluna [b]preço]/b] e estaria resolvido.

Preco R$ trocar por apenas preco

fim…

[quote=carlosj]Ola novamente,

Entao… segundo a documentacao

http://jasperreports.sourceforge.net/api/net/sf/jasperreports/view/JasperViewer.html

utilizando desta forma

JasperViewer.viewReport("RelatorioBibliotecaPessoal.jrprint",false); 

vc esta chamando o metodo:

viewReport(java.lang.String sourceFile, boolean isXMLFile)

por este motivo esta fechando a sua aplicacao… o certo seria utilizar o

viewReport(JasperPrint jasperPrint, boolean isExitOnClose)

        JasperPrint jpt = JasperFillManager.fillReport("RelatorioBibliotecaPessoal.jasper", parameters, jrRS);
        JasperViewer.viewReport(jpt, false);

Um abraço[/quote]

obrigado, me ajudou tambem

Aí Pessoal, eu tbm estou tendo um probleminha nesse contexto, o meu erro gerado é:

java.lang.NullPointerException at net.sf.jasperreports.engine.JRPropertiesMap.readObject(JRPropertiesMap.java:185) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:613) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:991) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1866) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1888) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1685) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1341) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1888) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1888) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:88) at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(JasperExportManager.java:77) at pkgClsUtilitario.clsJasperReport.<init>(clsJasperReport.java:33) at pkgClsUtilitario.clsJasperReport.main(clsJasperReport.java:62)

A Minha Classe Contém:

    public clsJasperReport() {
        String fileName = "C:\Users\Sahed Ribeiro\Documents\NetBeansProjects\GestStock-CompraVenda\src\Relatorios Jasper\TesteFactura2.jasper";
        String outFileName = "C:\Users\Sahed Ribeiro\Documents\NetBeansProjects\GestStock-CompraVenda\src\Relatorios Jasper\TesteFactura2.pdf";
        Map parametros = new HashMap();
        parametros.entrySet();
        try {
            ResultSet Resultado = objHelper.ExecutarQuery("stpActualizarFatura");
            if (Resultado != null) {
                if (Resultado.next()) {
                    JRResultSetDataSource jrResultSet = new JRResultSetDataSource(Resultado);
                    JasperExportManager.exportReportToPdfFile(fileName);
                    JasperPrint print = JasperFillManager.fillReport(fileName, parametros, jrResultSet);

                    JasperViewer.viewReport(print, false);
                    VisualizarFactura(outFileName);
                }
            }
        } catch (JRException jrEx) {
            jrEx.printStackTrace();
        } catch (Exception jrEx) {
            jrEx.printStackTrace();
        }
    }

Alguém pode me dar uma Ajuda?!