如何在jaspersoft的单个XYDataSet上设置多个渲染器报告jFreeChart的自定义程序

时间:2015-10-15 02:01:53

标签: jasper-reports jfreechart

我们在jaspersoft report社区版中有一个jfreechart,我们希望将两个渲染器应用于同一个DataSet。我们目前使用的方法没有按预期工作。

我们当前的方法如下:我们尝试将DataSet从索引0复制到索引1中,然后为每个索引设置一个渲染器。

xyplot.setDataset( 1, xyplot.getDataset(0) );
xyplot.setRenderer( 1, XYLineAndShapeRenderer_DashedLines );
xyplot.setRenderer( 0, xYDifferenceRenderer_GrayBand ); 

我们没有收到任何错误,但是这条线没有破损,我们确实得到了灰色条带,但它没有正确绘制。

然而,当我们评论出一个或另一个时,它们可以自行工作。

有点像第二个人覆盖了第一个。

这是在单个DataSet上设置多个渲染器的正确方法吗?如果是这样,我们做错了什么?

或者应该采取不同的方法,如果是的话,它是什么?

2 个答案:

答案 0 :(得分:2)

为了使渲染器正常工作,你需要2个不同的数据集(2:nd需要是你的情况下的另一个对象clone而不是指针)和2个不同的渲染器(似乎你已经有了这个)。 / p>

XYDataset xyDataset1 = .... //I'm a dataset
XYDataset xyDataset2 = .... //I'm a another dataset if same values I need to be a clone 
                           //you can't do xyDataset2 = xyDataset1 since like this I become xyDataset1

XYPlot plot = chart.getXYPlot();
plot.setDataset(0, xyDataset1);
plot.setDataset(1, xyDataset2);
XYLineAndShapeRenderer renderer0 = new XYLineAndShapeRenderer(); 
//do you personalizzation code
XYLineAndShapeRenderer renderer1 = new XYLineAndShapeRenderer(); 
//do you personalizzation code
plot.setRenderer(0, renderer0); 
plot.setRenderer(1, renderer1); 

答案 1 :(得分:1)

好的,所以最终解决了这个问题。我试图使用两个渲染器,一个用于灰色带,一个用于虚线,但我只需要使用一个。

所以最终的代码最终成了:

package gprCustomizer;

import org.jfree.chart.JFreeChart;
import net.sf.jasperreports.engine.JRChart;
import net.sf.jasperreports.engine.JRChartCustomizer;
import org.jfree.chart.renderer.xy.XYDifferenceRenderer;
import java.awt.BasicStroke;
import org.jfree.chart.plot.XYPlot;
import java.awt.Color;

public class GPRCustomizations implements JRChartCustomizer {
    public void customize(JFreeChart chart, JRChart jrChart) {
        // Get Plot
        XYPlot plot = (XYPlot)chart.getPlot();
        // Apply Gray Band Style
        XYDifferenceRenderer xYDifRnd_GrayBand = new XYDifferenceRenderer();
        xYDifRnd_GrayBand.setNegativePaint(Color.lightGray);
        xYDifRnd_GrayBand.setPositivePaint(Color.lightGray);
        xYDifRnd_GrayBand.setShapesVisible(false);
        xYDifRnd_GrayBand.setRoundXCoordinates(true);
        // Apply Dashed Style to Series 0,1
        xYDifRnd_GrayBand.setSeriesStroke(0, 
            new BasicStroke(
                2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
                1.0f, new float[] {6.0f, 6.0f}, 0.0f
            )
        );
        xYDifRnd_GrayBand.setSeriesStroke(1, 
            new BasicStroke(
                2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
                1.0f, new float[] {6.0f, 6.0f}, 0.0f
            )
        );
        plot.setRenderer(xYDifRnd_GrayBand);
        // Remove Borders from Legend
        if(chart.getLegend() != null)
        {
            chart.getLegend().setBorder(0.0, 0.0, 0.0, 0.0);   
        }
    }
}

这产生了灰色条带和虚线两边的预期结果:

Final Outcome