Esse artigo faz parte da revista Java Magazine edição 25. Clique aqui para ler todos os artigos desta edição

 

img

 

Atenção: por essa edição ser muito antiga não há arquivo PDF para download.Os artigos dessa edição estão disponíveis somente através do formato HTML.

 

Mais Gráficos com JFreeChart

Recursos Avançados e Novos Tipos

Aprenda a extrair o máximo da API JFreeChart, com gráficos XY e combinados, recursos visuais sofisticados e integração com relatórios

No artigo “Gráficos com JFreeChart” da edição anterior, apresentamos o JFreeChart, uma API open source poderosa para a criação de gráficos em Java. Vimos os conceitos, principais recursos e os tipos de gráficos mais usados. Neste artigo mostraremos facilidades adicionais do JFreeChart: como criar gráficos XY e buscar informações em um banco de dados; como alterar cores, girar fatias, criar efeitos de animação, e como montar gráficos combinados e com vários eixos. Mostraremos também a integração de gráficos com relatórios criados com iReport/JasperReports e JFreeReport.

Se você não está com a Edição 24 em mãos, aqui está uma recapitulação de alguns conceitos e classes importantes da API:

§      Datasets são os conjuntos de dados a serem plotados no gráfico. Os tipos de datasets mais usados são os de categoria, de pizza e XY.

§      Objetos plot definem propriedades para o gráfico, como cores, imagens de fundo, efeitos de transparência etc.; também cuidam do desenho de eixos e itens.

§      A classe org.jfree.chart.JFreeChart coordena o desenho de um gráfico, extraindo dados do dataset associado e delegando a renderização para o objeto plot (que pode ser obtido com o método getPlot())

§      A classe org.jfree.chart.ChartFactory inclui métodos estáticos de fábrica para a criação dos principais tipos de gráficos.

§      java.lang.Number é a superclasse abstrata de classes numéricas de Java – BigDecimal, BigInteger, Byte, Double, Float, Integer, Long e Short; é usada como tipo de parâmetro em vários métodos da API JFreeChart.

Gráficos XY

Os gráficos criados no primeiro artigo eram todos baseados em categorias, com valores agrupados por meses, anos, produtos etc. Mas gráficos deste tipo muitas vezes não são adequados para mostrar dados matemáticos ou científicos. Para isso temos os gráficos XY, que recebem pares de valores (x,y) e podem ser de linhas, área, barras e outras variações.

As séries usadas para gerar um gráfico XY são representadas por objetos org.jfree.data.xy.XYSeries. Para adicionar dados a uma dessas séries, utilizamos o método add(), que recebe os valores nos dois eixos (do tipo double ou Number). Depois agrupamos as séries em uma "coleção de séries", que é comumente uma org.jfree.data.xy.XYSeriesCollection. Tendo as séries preenchidas e agrupadas, já podemos criar o gráfico. Usamos a classe org.jfree.chart.ChartFactory, que oferece métodos createXYTipo() para vários tipos de gráficos XY.

No nosso primeiro exemplo (Listagem 1), utilizamos createXYLineChart(), que recebe o título do gráfico, as legendas do eixo x e y, o dataset e a orientação do gráfico (vertical ou horizontal), além de flags que indicam se devem ser mostradas legendas e exibidos tooltips e URLs. O exemplo gera um gráfico simples com três séries XY contendo valores das funções seno, co-seno e logaritmo natural (veja a Figura 1). Depois é gravada uma imagem PNG do gráfico em disco.

Acesso via DAO

Para não nos basearmos somente em dados estáticos, vamos criar uma aplicação que se conecta a um banco de dados via JDBC. Aproveitamos para mostrar recursos adicionais do JFreeChart gerando um gráfico de barras com novos recursos de plotagem e um gráfico de pizza múltiplo, bem como um dataset que se conecta diretamente ao BD.

Vamos usar uma tabela com informações sobre vendas de produtos de uma empresa. A Listagem 2 exibe os comandos SQL para criar a base de dados e inserir os dados iniciais[1] (neste exemplo, utilizamos o banco de dados MySQL, mas pode ser usado qualquer outro que tenha um driver JDBC atualizado).

Com base no nosso modelo de dados, criaremos uma classe Venda – um JavaBean simples que armazena os dados de uma venda e contém métodos get e set (Listagem 3). A classe responsável por buscar os dados no BD é VendaDAO (não listada), que segue o pattern Data Access Object. A Listagem 4 mostra o código de GraficoComBD, que é a classe principal do programa (descendente de JFrame). No construtor, após montar a interface gráfica, é chamado o método criarGraficos() que busca os dados usando o DAO e gera os gráficos com base na lista de valores obtida:

VendaDAO dao = new VendaDAO();

dao.conectar();

List vendas = dao.buscarTodos();

mostrarGrafico1(vendas);

List totais = dao.buscarTotais();

mostrarGrafico2(totais);

Os métodos mostrarGrafico1() e mostrarGrafico2() recebem um List com objetos Venda e criam dois gráficos: um de barras simples e outro de pizza múltiplo (apresentado na próxima seção). Ambos os métodos iteram pelos itens do List e adicionam os valores dos itens aos datasets; depois criam os gráficos e os adicionam à janela da aplicação. Os gráficos podem ser vistos nas Figuras 2 e 3.

Acesso direto via JDBC

Outra maneira de exibir dados de um BD em gráficos é utilizando datasets que trabalham diretamente com JDBC, tirando do desenvolvedor a tarefa de recuperar os dados e montar o dataset (mas trazendo menos flexibilidade). Existem três datasets desse tipo no JFreeChart: JDBCCategoryDataset, JDBCPieDataset e JDBCXYDataset (classes do pacote org.jfree.data.jdbc).

O método mostrarGrafico3() na Listagem 4 constrói um gráfico de pizza usando JDBCPieDataset. O construtor deste dataset recebe uma conexão JDBC ativa com o banco; seu método executeQuery() executa uma consulta SQL que deve recuperar exatamente duas colunas, sendo a primeira a das categorias e a segunda a dos valores.

Para datasets do tipo JDBCCategoryDataset, a consulta SQL deve retornar duas ou mais colunas, contendo as categorias na primeira, e nas demais os valores das séries. A consulta para JDBCXYDatasets deve também retornar ao menos duas colunas: a primeira com valores do eixo X e as restantes com os valores de um ou mais eixos Y (cada nova coluna representa um eixo adicional).

Gráficos de pizza múltiplos

Os gráficos de pizza múltiplos mostram diversas visões dos dados de um mesmo dataset. Em vez de PieDataset, que é usado em gráficos de pizza simples, os gráficos múltiplos são criados a partir de um DefaultCategoryDataset (pacote org.jfree.data.category). Isso permite adicionar várias séries ao dataset, com cada uma definindo um gráfico diferente.

O método mostrarGrafico2() demonstra como criar um gráfico de pizza múltiplo. Basicamente o método itera pelos itens de uma lista, inserindo dados em duas séries distintas; a primeira armazena a quantidade vendida por produto e a segunda contém o valor da venda:

dataset.addValue(venda.getQuantidade(),

     "Quantidade Total de Venda", venda.getProduto());

dataset.addValue(venda.getValor(),

    "Valor Total de Venda (R$)", venda.getProduto());

O método addValue() de DefaultCategoryDataset recebe três argumentos: o valor do item (do tipo double ou Number), a série e a categoria. Os dois últimos devem ser de classes que implementem java.lang.Comparable (exemplos são strings, classes wrapper como Integer, Double etc. e Date). Para gerar o gráfico, chamamos ChartFactory.createMultiplePieChart(), passando o título do gráfico, o dataset, o tipo de ordenação (por linha ou por coluna) e alguns flags.

À moda do cliente

Gráficos básicos já serão uma bela atração para as suas aplicações, mas o JFreeChart permite ir além. A Listagem 5 contém o código resumido de uma aplicação Swing criada para este artigo, que exibe quatro gráficos, onde são demonstrados diversos recursos mais sofisticados do JFreeChart. O código completo pode ser baixado no site da Java Magazine.

O primeiro gráfico criado é um de pizza simples, cuja novidade está em suas propriedades de plotagem. Mudamos as cores e o ângulo inicial das fatias e destacamos uma fatia, além de criar efeitos simples de animação. O método gerarGraficoPizza() cria o gráfico, altera suas propriedades iniciais e o exibe na tela. Neste método, após buscar os dados, montar o dataset e gerar o “modelo” do gráfico (o objeto JFreeChart), alteramos algumas propriedades de plotagem com o código a seguir:

PiePlot pieplot = (PiePlot) grafico.getPlot();

pieplot.setStartAngle(0);

pieplot.setExplodePercent(0, 0.2);

Veja que recuperamos o objeto de plotagem do gráfico de pizza (do tipo PiePlot) e utilizamos o método setStartAngle() para definir o ângulo inicial das fatias. Por padrão, o ângulo inicial é de 90 graus; o zero é fixado na extremidade direita do gráfico, e o ângulo aumenta no sentido anti-horário. ...

Quer ler esse conteúdo completo? Tenha acesso completo