Estou com um pequeno problema para gerar gráficos utilizando o jFreeChart.
Procurei no GUJ e em outras fontes, mas não encontrei nenhum caso similar.
Preciso gerar gráficos agrupados por um código - no caso código de agências bancárias. Ou seja, se minha lista retorna dados referentes as agências 1221 e 2020, preciso criar 02 imagens de 02 gráficos separadamente.
Eu utilizo o mediaOutput para exibir a imagem do gráfico gerada, como não sei a quantidade de gráficos que deverá ser exibida, utilizei o repeat para reservar este espaço.
Problema: o repeat não executa o createContent as 02 vezes, o executa apenas 01 vez e exibe a mesma imagem 02 vezes (ao invés de gerar a 2ª imagem, repete a 1ª).
BEAN
/**
* Nome: generateTela
* Propósito: Montar e exibir o gráfico na tela
*
* @param OutputStream out
* @param Object data
*/
public void generateTela(OutputStream out, Object data) throws Exception {
List<RelatRegistroCartaJuncaoDataObject> listaRelatorioRelatorioCartaJuncaoDataObject =
relatRegistroCartaJuncaoService.listar(this.dtInicio,
this.dtTermino,
this.selectApos,
this.cdPlataformaAtendimento,
this.cdDependencia,
this.cdFuncionarioOperadorSistema,
this.cdSegmento,
this.cdModalidade);
CategoryDataset dataset = createDataset(listaRelatorioRelatorioCartaJuncaoDataObject);
JFreeChart chart = createChart(dataset);
BufferedImage buffImg = chart.createBufferedImage(
511, //width
270, //height
BufferedImage.TYPE_INT_RGB, //image type
null);
ImageIO.write(buffImg, "jpeg", out);
}
/**
* Nome: createDataset
* Propósito: Identificar os dados a serem informados no gráfico
*
* @param lista
* @return dataset
*/
private CategoryDataset createDataset(List<RelatRegistroCartaJuncaoDataObject> lista) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
int agenciaAnterior=lista.get(0).getCdAgencia();
for (int i = 0; i < lista.size(); i++) {
if(lista.get(i).getCdAgencia() == agenciaAnterior){
RelatRegistroCartaJuncaoDataObject relatJuncao = lista.get(i);
String item = relatJuncao.getCdAgencia().toString();
String modalidade = relatJuncao.getModalidade();
dataset.addValue(relatJuncao.getQuantidadeTransacao(), modalidade, item);
agenciaAnterior=lista.get(i).getCdAgencia();
}
}
return dataset;
}
JSP
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<a4j:repeat value="#{registrosCartasJuncaoBean.listaRelatorioJuncao}">
<br:brColumn>
<br:brPanelGrid columns="1" align="center">
<br:brColumn>
<a4j:mediaOutput element="img" cacheable="false" session="true"
id="grafico" mimeType="image/jpeg"
createContent="#{registrosCartasJuncaoBean.generateTela}" />
</br:brColumn>
</br:brPanelGrid>
</br:brColumn>
</a4j:repeat>
(Obs.: O método utilizado pelo repeat retorna apenas o número de vezes que devo repetir o mediaOutput, por este motivo não o inclui aqui. Também não inclui o método createChart propositalmente, visto que este não interferirá no entendimento.)
Segue abaixo o comportamento atual da geração dos relatórios (esquerda) e o comportamento correto (direita).
Alguém consegue me orientar quanto a isso ? Meu problema é na lógica? No JSP ? Nos componentes que estou utilizando ? … enfim…
