O que é JFreeChart?

 

Visão Geral

JFreeChart é uma biblioteca livre para a  plataforma Java(tm). Foi desenvolvida para ser utilizada em Aplicações Desktop, Applets, Servlets e JSP.

 

jfreechartfig01.JPG

Figura 1 – Exemplo de gráfico do JFreeChart.

 

Características

Jfreechart pode ser usado para gerar gráficos de Pizza, gráficos de Barra, gráficos de linha (com ou sem efeito 3D), gráficos combinados, dentre diversos outros tipos de gráficos. Exporta dados para o formato PNG ou JPEG, Exporta para qualquer formato usando a implementação de Graphics2D incluindo:

PDF via iText (http://www.lowagie.com/iText/);

SVG via Batik (http://xml.apache.org/batik/);

 

Jfreechart é inteiramente escrito em Java e pode ser utilizado em qualquer implementação da plataforma Java 2 (JDK 1.2.2 ou superior).

 

Obtendo o JfreeChart

JfreeChart pode ser baixado a partir do endereço:

 

http://www.jfree.org/jfreechart/index.html

 

Neste endereço você poderá obter as ultimas informações sobre JfreeChart, exemplos de gráficos, downloads, documentação e até um fórum.

 

Sobre este Tutorial

Neste tutorial, procurarei mostrar como se faz para criar um gráfico a partir de uma fonte de dados e mostrar este gráfico em um relatório gerado no iReport a partir de um Servlet. Usando como exemplo um relatório comparativo de vendas de CDs e DVDs durante um certo período.

 

Não daremos muitas explicações sobre iReport, pois este não é o objetivo deste tutorial. Apresentaremos apenas como montar um modelo no iReport para receber o gráfico gerado.

 

Veremos também que o código necessário para a chamada do relatório é mínimo.

 

Para este tutorial usei o JfreeChart 1.0.1 que é a ultima versão disponível para Download.

 

Servlets

A API de Java Servlets é uma tecnologia muito usada para a criação de Aplicações Web e  JfreeChart é um serviço muito bom para ser usado também por Servlets.

 

Neste tutorial vamos mostrar um Servlet gerando um gráfico e em seguida chamando um relatório criado no iReport mostrando o gráfico gerado.

 

O método doGet(...)

O método doGet(...) é chamado pelo Servlet quando uma requisição é enviada pelo cliente (geralmente através de um browser). Em resposta à requisição o Servlet que iremos criar irá realizar os seguintes passos:

 

  • Obtém uma referencia de OutputStream para retornar uma saída ao cliente;
  • Cria o gráfico;
  • Um content type para a resposta é settado para Application/Pdf para exibir o relatório em formato PDF;
  • Criar o relatório passando para ele os dados que geraram o gráfico e a imagem do gráfico gerada.
  • Fechar o OutputStream.

Adicionando os Jar’s

Os .jar’s do JfreeChart que utilizei são jcommon-1.0.0.jar e jfreechart-1.0.1.jar. Primeiramente vamos adicioná-los ao lib do nosso projeto.

 

jfreechartfig021.JPG

Figura 2 – Adicionando os jar’s do JFreeChart.

 

Os Jar’s do iReport que utilizei são: jasperreports-1.2.0.jar, commonslogging-api-1.0.2.jar, commons-collections-3.1.jar, barbecue-1.1.jar, iReport.jar, commons-beanutils-1.5.jar, itext-1.3.1.jar.

 

jfreechartfig03.JPG

Figura 3 – Adicionando os jar’s do iReport.

 

Gerando os Gráficos

Primeiramente, vamos criar as classes ModeloGraficoItem que armazenará os dados que darão origem ao gráfico e ComposicaoDadosItemGrafico que gerará valores arbitrários que serão exibidos no gráfico:

 

ModeloGraficoItem.java

 

import java.io.Serializable;

import java.util.ArrayList;

 

public class ModeloGraficoItem implements Serializable {

 

    private String mes;

    private String produto;

    private int quantidade;

 

    public ModeloGraficoItem() {

    }

 

    public ModeloGraficoItem(String mes, String produto, int quantidade) {

        this.mes = mes;

        this.produto = produto;

        this.quantidade = quantidade;

    }

 

    public String getMes() {

        return mes;

    }

 

    public void setMes(String mes) {

        this.mes = mes;

    }

 

    public String getProduto() {

        return produto;

    }

 

    public void setProduto(String produto) {

        this.produto = produto;

    }

 

    public int getQuantidade() {

        return quantidade;

    }

 

    public void setQuantidade(int quantidade) {

        this.quantidade = quantidade;

    }

}

 

 

ComposicaoDadosItemGrafico.java

 

import java.util.ArrayList;

 

public class ComposicaoDadosItemGrafico {

 

    protected ArrayList array = new ArrayList();

 

    public ComposicaoDadosItemGrafico() {

        array.add(new ModeloGraficoItem("JANEIRO", "CD", 20));

        array.add(new ModeloGraficoItem("FEVEREIRO", "CD", 30));

        array.add(new ModeloGraficoItem("MARCO", "CD", 40));

        array.add(new ModeloGraficoItem("ABRIL", "CD", 50));

        array.add(new ModeloGraficoItem("MAIO", "CD", 60));

        array.add(new ModeloGraficoItem("JUNHO", "CD", 70));

 

        array.add(new ModeloGraficoItem("JANEIRO", "DVD", 10));

        array.add(new ModeloGraficoItem("FEVEREIRO", "DVD", 70));

        array.add(new ModeloGraficoItem("MARCO", "DVD", 140));

        array.add(new ModeloGraficoItem("ABRIL", "DVD", 10));

        array.add(new ModeloGraficoItem("MAIO", "DVD", 54));

        array.add(new ModeloGraficoItem("JUNHO", "DVD", 23));

    }

 

    public ArrayList getArray() {

        return array;

    }

 

 

    public void setArray(ArrayList array) {

        this.array = array;

    }

}

 

A seguir a classe GeradorGrafico implementa 2 tipos de gráficos: Gráfico de Barras e Gráfico de Linha com e sem efeito 3D.

 

import java.awt.image.BufferedImage;

import java.util.ArrayList;

import java.util.Iterator;

 

import org.jfree.chart.ChartFactory;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.plot.PiePlot;

import org.jfree.chart.plot.PlotOrientation;

import org.jfree.data.category.DefaultCategoryDataset;

import org.jfree.data.general.DefaultPieDataset;

import java.awt.Color;

 

public class GeradorGrafico {

    public GeradorGrafico() {

    }

 

    /**

     * Gera um gráfico de barras 3D Vertical

     * @param tituloGrafico String, o titulo do gráfico

     * @param tituloEixoX String, o titulo do eixo X

     * @param tituloEixoY String, o titulo do eixo Y

     * @param arrayValores ArrayList, a lista com os valores para o gráfico

     * @return BufferedImage, a imagem do Gráfico gerada

     *

     * A classe DefaultCategoryDataset recebe os valores que irão gerar o gráfico

     * DefaultCategoryDataset.addValue(Number, Comparable, Comparable)

     * DefaultCategoryDataset.addValue(Double, Comparable, Comparable)

     */

    public static BufferedImage gerarGraficoBarraVertical3D(String tituloGrafico, String

               tituloEixoX, String tituloEixoY, ArrayList arrayValores) throws Exception {

        BufferedImage buf = null;

        try {

            DefaultCategoryDataset defaultCategoryDataset = new DefaultCategoryDataset();

            Iterator iterator = arrayValores.iterator();

            while (iterator.hasNext()) {

                ModeloGraficoItem modelo = (ModeloGraficoItem) iterator.next();

                defaultCategoryDataset.addValue(modelo.getQuantidade(),

                                    modelo.getProduto(), modelo.getMes().substring(0, 3));

            }

            JFreeChart chart = ChartFactory.createBarChart3D(tituloGrafico, tituloEixoX,

                          tituloEixoY, defaultCategoryDataset, PlotOrientation.VERTICAL,

                          true, false, false);

            chart.setBorderVisible(true);

            chart.setBorderPaint(Color.black);

            buf = chart.createBufferedImage(400, 250);

        } catch (Exception e) {

            throw new Exception(e);

        }

        return buf;

    }

 

    /**

     * Gera um gráfico de barras Vertical

     */

    public static BufferedImage gerarGraficoBarraVertical(String tituloGrafico, String

                tituloEixoX, String tituloEixoY, ArrayList arrayValores)throws Exception {

        BufferedImage buf = null;

        try {

            DefaultCategoryDataset defaultCategoryDataset = new DefaultCategoryDataset();

            Iterator iterator = arrayValores.iterator();

            while (iterator.hasNext()) {

                ModeloGraficoItem modelo = (ModeloGraficoItem) iterator.next();

                defaultCategoryDataset.addValue(modelo.getQuantidade(),

                                    modelo.getProduto(), modelo.getMes().substring(0, 3));

            }

            JFreeChart chart = ChartFactory.createBarChart(tituloGrafico, tituloEixoX,

        tituloEixoY, defaultCategoryDataset, PlotOrientation.VERTICAL, true, false, false);

            chart.setBorderVisible(true);

            chart.setBorderPaint(Color.black);

            buf = chart.createBufferedImage(400, 250);

        } catch (Exception e) {

            throw new Exception(e);

        }

        return buf;

    }

 

    /**

     * Gera um Grafico de Linhas

     */

    public static BufferedImage gerarGraficoLinha(String tituloGrafico, String tituloEixoX,

                             String tituloEixoY, ArrayList arrayValores) throws Exception {

        BufferedImage buf = null;

        try {

            DefaultCategoryDataset defaultCategoryDataset = new DefaultCategoryDataset();

            Iterator iterator = arrayValores.iterator();

            while (iterator.hasNext()) {

                ModeloGraficoItem modelo = (ModeloGraficoItem) iterator.next();

                defaultCategoryDataset.addValue(modelo.getQuantidade(),

                                     modelo.getProduto(), modelo.getMes().substring(0, 3));

            }

            JFreeChart chart = ChartFactory.createLineChart(tituloGrafico, tituloEixoX,

                             tituloEixoY, defaultCategoryDataset, PlotOrientation.VERTICAL,

                             true, false, false);

            chart.setBorderVisible(true);

            chart.setBorderPaint(Color.black);

            buf = chart.createBufferedImage(400, 250);

        } catch (Exception e) {

            throw new Exception(e);

        }

        return buf;

    }

 

    /**

     * Gera um grafico de linhas 3D

     */

    public static BufferedImage gerarGraficoLinha3D(String tituloGrafico, String

                tituloEixoX, String tituloEixoY, ArrayList arrayValores)throws Exception {

        BufferedImage buf = null;

        try {

            DefaultCategoryDataset defaultCategoryDataset = new DefaultCategoryDataset();

            Iterator iterator = arrayValores.iterator();

            while (iterator.hasNext()) {

                ModeloGraficoItem modelo = (ModeloGraficoItem) iterator.next();

                defaultCategoryDataset.addValue(modelo.getQuantidade(),

                                     modelo.getProduto(), modelo.getMes().substring(0, 3));

            }

            JFreeChart chart = ChartFactory.createLineChart3D(tituloGrafico, tituloEixoX,

                             tituloEixoY, defaultCategoryDataset, PlotOrientation.VERTICAL,

                             true, false, false);

            chart.setBorderVisible(true);

            chart.setBorderPaint(Color.black);

            buf = chart.createBufferedImage(400, 250);

        } catch (Exception e) {

            throw new Exception(e);

        }

        return buf;

    }

 

}

Leia também