Quem já tentou gerar relatórios com gráficos em suas aplicações java? Muitos já conseguiram outros sem sucesso, complicado em? Existe uma biblioteca chamada JfreeChart, que permite ao desenvolvedor de aplicações java gerar gráficos com facilidade e com qualidade profissional.
PASSO 1: Baixe a biblioteca JfreeChart , extraia o arquivo em um diretório de sua preferencia, abra sua IDE preferida, no meu caso vou utilizar a IDE eclipse, crie um projeto.
Passo 2: Clique com o botão direito do mouse em cima do seu projeto, Build Path, Configure Build Patch…
abrirá uma janela, selecione Libraries, escolha a opção Add External JARs…, vá até o diretório onde você extraiu o JfreeChart, lib, e selecione os seguintes .JAR (jcommon-1.0.17.jar e jfreechart-1.0.14.jar) ficando da seguinte forma:
Passo 3: Crie uma classe chamada PieChart, e coloque o seguinte código:
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.util.Rotation;
public class PieChart extends JFrame {
private static final long serialVersionUID = 1L;
public PieChart(String applicationTitle, String chartTitle) {
super(applicationTitle);
// Isso irá criar o conjunto de dados
PieDataset dataset = createDataset();
// com base no conjunto de dados que criamos o gráfico
JFreeChart chart = createChart(dataset, chartTitle);
// vamos colocar o gráfico em um painel
ChartPanel chartPanel = new ChartPanel(chart);
// default tamanho
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
// adiciona a nossa aplicação
setContentPane(chartPanel);
}
/**
* Cria um conjunto de dados de amostra
*/
private PieDataset createDataset() {
DefaultPieDataset result = new DefaultPieDataset();
result.setValue("Linux", 29);
result.setValue("Mac", 20);
result.setValue("Windows", 51);
return result;
}
/**
* Cria um gráfico
*/
private JFreeChart createChart(PieDataset dataset, String title) {
JFreeChart chart = ChartFactory.createPieChart3D(title, // título / gráfico
dataset, // dados
true, // include lenda
true, false);
PiePlot3D plot = (PiePlot3D) chart.getPlot();
plot.setStartAngle(290);
plot.setDirection(Rotation.CLOCKWISE);
plot.setForegroundAlpha(0.5f);
return chart;
}
}
Crie uma outra class chamada de Main e adicione o seguinte código:
public class Main {
public static void main(String[] args) {
PieChart demo = new PieChart("Comparação", "Qual sistema operacional você está usando?");
demo.pack();
demo.setVisible(true);
}
}
Agora é só executar e ver o gráfico que foi gerado…
estude as bibliotecas e gere com facilidade os diversos gráficos que a API lhe permite, esse é apenas um exemplo existem outros exemplos no site da API JFreeChart.
Até a próxima.
Ótimo tutorial, Parabéns!
Obrigado!
Muito bom
Obrigado!
Como eu faço para adicionar o gráfico em um frame já existente?
Francisco, parabéns pela postagem!
Gerei um relatório que exibe vários gráficos, no ireport ele funciona normalmente, mas quando gero o arquivo .jasper e o chamo pelo netbeans dá esse erro:
jan 21, 2017 10:23:12 AM net.sf.jasperreports.engine.fill.JRFillSubreport prepare
GRAVE: Fill 1: exception
java.lang.ClassCastException: org.jfree.chart.axis.NumberTickUnitSource cannot be cast to org.jfree.chart.axis.TickUnits
at net.sf.jasperreports.charts.util.ChartUtil.createStandardTickUnits(ChartUtil.java:329) at net.sf.jasperreports.charts.util.ChartUtil.createStandardTickUnits(ChartUtil.java:329)
at net.sf.jasperreports.engine.fill.DefaultChartTheme.calculateTickUnits(DefaultChartTheme.java:2200)
at net.sf.jasperreports.engine.fill.DefaultChartTheme.setAxisBounds(DefaultChartTheme.java:2116)
at net.sf.jasperreports.engine.fill.DefaultChartTheme.configureAxis(DefaultChartTheme.java:599)
at net.sf.jasperreports.engine.fill.DefaultChartTheme.createLineChart(DefaultChartTheme.java:1022)
at net.sf.jasperreports.engine.fill.DefaultChartTheme.createChart(DefaultChartTheme.java:289)
at net.sf.jasperreports.engine.fill.JRFillChart.evaluateChart(JRFillChart.java:843)
at net.sf.jasperreports.engine.fill.JRFillChart.evaluateRenderer(JRFillChart.java:808)
at net.sf.jasperreports.engine.fill.JRFillChart.evaluate(JRFillChart.java:797)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:259)
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:455)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillFixedBand(JRHorizontalFiller.java:2174)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillFixedBand(JRHorizontalFiller.java:2168)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillPageFooter(JRHorizontalFiller.java:1098)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillSummaryNoLastFooterSamePage(JRHorizontalFiller.java:1228)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillSummary(JRHorizontalFiller.java:1123)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillReportEnd(JRHorizontalFiller.java:332)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillReport(JRHorizontalFiller.java:164)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:822)
at net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport(JRFillSubreport.java:651)
at net.sf.jasperreports.engine.fill.JRSubreportRunnable.run(JRSubreportRunnable.java:59)
at net.sf.jasperreports.engine.fill.AbstractThreadSubreportRunner.run(AbstractThreadSubreportRunner.java:203)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: org.jfree.chart.axis.NumberTickUnitSource cannot be cast to org.jfree.chart.axis.TickUnits
at net.sf.jasperreports.charts.util.ChartUtil.createStandardTickUnits(ChartUtil.java:329)
at net.sf.jasperreports.engine.fill.DefaultChartTheme.calculateTickUnits(DefaultChartTheme.java:2200)
at net.sf.jasperreports.engine.fill.DefaultChartTheme.setAxisBounds(DefaultChartTheme.java:2116)
at net.sf.jasperreports.engine.fill.DefaultChartTheme.configureAxis(DefaultChartTheme.java:599)
at net.sf.jasperreports.engine.fill.DefaultChartTheme.createLineChart(DefaultChartTheme.java:1022)
at net.sf.jasperreports.engine.fill.DefaultChartTheme.createChart(DefaultChartTheme.java:289)
at net.sf.jasperreports.engine.fill.JRFillChart.evaluateChart(JRFillChart.java:843)
at net.sf.jasperreports.engine.fill.JRFillChart.evaluateRenderer(JRFillChart.java:808)
at net.sf.jasperreports.engine.fill.JRFillChart.evaluate(JRFillChart.java:797)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:259)
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:455)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillFixedBand(JRHorizontalFiller.java:2174)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillFixedBand(JRHorizontalFiller.java:2168)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillPageFooter(JRHorizontalFiller.java:1098)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillSummaryNoLastFooterSamePage(JRHorizontalFiller.java:1228)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillSummary(JRHorizontalFiller.java:1123)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillReportEnd(JRHorizontalFiller.java:332)
at net.sf.jasperreports.engine.fill.JRHorizontalFiller.fillReport(JRHorizontalFiller.java:164)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:822)
at net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport(JRFillSubreport.java:651)
at net.sf.jasperreports.engine.fill.JRSubreportRunnable.run(JRSubreportRunnable.java:59)
at net.sf.jasperreports.engine.fill.AbstractThreadSubreportRunner.run(AbstractThreadSubreportRunner.java:203)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Você poderia me dar alguma dica sobre como resolver?
Esse erro só acontece no relatório que tem gráfico, para outros relatórios “roda” perfeitamente.
como criar o grafico dinamico em java, isto buscando os dados no mysl?