Imprimir um texto no Jasper

2 respostas
B

Gente

Fiz um texto padrao no IReport, sem qualquer link com banco de dados. Visualizando por lá, sem utilizar base de dados, o texto aparece legal. Já quando uso a base ativa recebo uma mensagem dizendo que o texto esta vazio e nao pode ser mostrado. Tudo bem, isso já era esperado.

Pois bem. Meu problema é que não descobri como disparar o report sem base de dados a partir de uma classe java. Tentei assim, mas nao deu certo, ele simplesmente me ignora.

JasperReport relatorio = JasperCompileManager.compileReport("c:\\teste.jrxml");
                    Map parametros = new HashMap();
                    parametros=null;
                    JasperPrint impressao = JasperFillManager.fillReport(relatorio, parametros);
                    
                    JasperViewer view = new JasperViewer(impressao);
                    view.show();

Não dá erro, nem nada… Sou solenemente ignorado, o que, cá entre nós, programadores, é pior do que um erro. hehehehe…

Sem falar que meu Netbeans 5 diz que o método show é “deprecated”. Ele até não dá erro, mas acho que não é uma boa utilizá-lo. Como não achei nada que o substituísse meto bala com ele mesmo, até que eu descubra ( ou uma nobre alma me ajude ).

A quem puder ajudar, desde já agradeço
Bonissauro

2 Respostas

A

Ao invés do método show() use o método setVisible(true), é a substituição dele devido ao método show() estar obsoleto (deprecated).

Quanto a rodar o jasper sem acesso à base de dados você precisa fazer uma classe que implente a interface JRDataSource.
Exemplo:

public class MyDataSource implements JRDataSource {

	Vector fields = null;
	Vector data = null;
	Iterator itData = null;
	Object nextData = null;

	public MyDataSource(Vector fields, Vector data){
		this.fields = fields;
		this.data = data;
		itData = data.iterator();
	}

	/* (non-Javadoc)
	 * @see net.sf.jasperreports.engine.JRDataSource#next()
	 */
	public boolean next() throws JRException {
		boolean hasNext = itData.hasNext();
		if(hasNext==true)
			nextData = itData.next();
		return hasNext;
	}

	/* (non-Javadoc)
	 * @see net.sf.jasperreports.engine.JRDataSource#getFieldValue(net.sf.jasperreports.engine.JRField)
	 */
	public Object getFieldValue(JRField arg0) throws JRException {
		Iterator it = fields.iterator();
		int i = 0;
		int index = 0; 
		for(Object element = it.next();it.hasNext();element = it.next(),i++)
			if(element.toString().compareToIgnoreCase(arg0.getName())==0)
				index = i;
		
		return ((Vector) nextData).get(index);
	}

}

Este dataSource por exemplo, em seu construtor é passado dois parâmetros o primeiro é um vector com o nome de todos os fields cadastrados no esqueleto (xml) do relatório, e o segundo tb é um vector com todos os dados destes fields. O segundo parâmetro contém vários vectors dentro dele, cada qual indicando uma linha do relatório.

Aí depois é só gerar estes vectors, criar um objeto de MyDataSource e mandar preencher o relatorio com o JasperFillManager.fillReport() como vc fez:

MyDataSource dataSource = new MyDataSource(fields, results);
JasperPrint impressao = JasperFillManager.fillReport(relatorio, parametros, dataSource);
B

Bah, isso que me ensinaste vai muito me ajudar no futuro. Imagino que para imprimir dados constante em JTables por exemplo. Ótimo, já me quebraste um galhao de um problema que eu ainda nem tinha…

Mas o caso é que meu relatorio, origem deste post, nao tem nem campos. Ele tem apenas texto estático, uma folha só. Tipo assim, uma carta padrao sem nem sequer o nome do cara, coisa bem vagaba mesmo…

Em todo caso, valew pela dica
Bonissauro

Criado 11 de maio de 2006
Ultima resposta 12 de mai. de 2006
Respostas 2
Participantes 2