I'm using Jasper Reports to generate a series of stacked bar charts. As well as the stacked bars, each chart also needs to display a trend-line.
The dataset is formatted using XML. I'm using XPath to access series/category data (this includes trend-line data). Jasper Reports has this concept of a chart customiser that provides access to the JFree API. I've used it to modify things like label positions so far.
Given a org.jfree.chart.plot.CategoryPlot is there a way of cherry picking the trending data and displaying it as a trend-line? Here's what I'm thinking:
Code: Select all
package com.myplace;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Stroke;
import net.sf.jasperreports.engine.JRChart;
import net.sf.jasperreports.engine.JRChartCustomizer;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.*;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.renderer.xy.XYSplineRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.xy.XYDataset;
public class BillingSummaryModifier3 implements JRChartCustomizer {
public void customize(JFreeChart jfChart, JRChart jrChart) {
CategoryPlot categoryPlot = jfChart.getCategoryPlot();
CategoryDataset categoryDataset = categoryPlot.getDataset(5); \\ I'm guessing this is the index to my trend data
// Somehow get categoryDataset into an XYPlot, then render on the chart
XYSplineRenderer splineRenderer = new XYSplineRenderer();
splineRenderer.setSeriesShapesVisible( 0, false );
splineRenderer.setSeriesShapesVisible( 1, false );
splineRenderer.setSeriesLinesVisible( 1, false );
splineRenderer.setSeriesStroke(
0,
(Stroke) new BasicStroke(4.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 1.0f, null, 0.0f)
);
splineRenderer.setSeriesPaint( 0, new Color( 255, 140, 0 ) );
splineRenderer.setSeriesVisibleInLegend( 1, Boolean.FALSE );
XYPlot xyPlot = new XYPlot();
xyPlot.setDataset(0, (XYDataset) categoryDataset);
XYLineAndShapeRenderer plotRenderer = (XYLineAndShapeRenderer)((XYPlot)jfChart.getPlot()).getRenderer();
plotRenderer.setSeriesVisible( 0, Boolean.FALSE );
plotRenderer.setSeriesVisibleInLegend( 0, Boolean.FALSE );
}
}
Any advice on whether or not this can be done (and if so, how) would be much appreciated.net.sf.jasperreports.engine.JRException: java.lang.ClassCastException: org.jfree.chart.plot.CategoryPlot cannot be cast to org.jfree.chart.plot.XYPlot
at com.jaspersoft.studio.editor.preview.view.control.ReportControler.fillReport(ReportControler.java:506)
at com.jaspersoft.studio.editor.preview.view.control.ReportControler.access$20(ReportControler.java:481)
at com.jaspersoft.studio.editor.preview.view.control.ReportControler$5.run(ReportControler.java:362)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
Caused by: java.lang.ClassCastException: org.jfree.chart.plot.CategoryPlot cannot be cast to org.jfree.chart.plot.XYPlot
at com.oriel.BillingSummaryModifier3.customize(BillingSummaryModifier3.java:12)
at net.sf.jasperreports.engine.fill.JRFillChart.evaluateChart(JRFillChart.java:861)
Regards
Chris