【问题标题】:How to set multiple Renderers on a single XYDataSet in jaspersoft reports customizer for jFreeChart如何在 jFreeChart 的 jaspersoft 报告定制器中的单个 XYDataSet 上设置多个渲染器
【发布时间】:2015-10-15 02:01:52
【问题描述】:

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

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

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

我们没有得到任何错误,但线不是虚线,我们确实得到了灰色带,但它没有正确绘制。

但是,当我们注释掉一个或另一个时,它们本身就可以正常工作。

感觉第二个覆盖了第一个。

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

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

【问题讨论】:

    标签: jasper-reports jfreechart


    【解决方案1】:

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

    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); 
    

    【讨论】:

    • 感谢您的回复。所以 XYPlot.getDataset(0) 返回一个 XYDataSet。 DefaultXYDataSet 有一个克隆方法,DefaultXYDataSet 说它在 doco 中实现了 XYDataset。但是当我尝试 xyplot.setDataset(1, xyplot.getDataset(0).clone());我收到编译错误 XYDataset 类型的方法 clone() 未定义。你知道我如何克隆一个 XYDataSet 吗?
    • 抱歉调查了一些,尝试 ((DefaultXYDataSet)xyplot.getDataset(0)).clone(),如果系列键例如不可克隆,它可能会失败。如果数据集不是DefaultXYDataSet 的实例,您需要自己创建 clone() ......但我相信它是......
    • 好的,我会试一试,感谢您抽出宝贵的时间,Petter,如果可行,我会告诉您并接受答案 ;-)
    • 好的,所以它不会将 XYDataset 转换为 DefaultXYDataset。说类型不兼容。 XYDataset 没有任何方法来设置值或克隆......所以我猜新问题是如何克隆 XYDataSet?没有设置器,我什至无法创建一个 for 循环来填充一个。另外 XYDataSet 是一个接口而不是一个类......所以我想我需要找出实现 XYDataSet 接口的类对象实际上正在传递......就像它可能是一个 XYSeriesCollection......我会做一些测试这是早上的。
    • Tyr 了解你有哪个类 className().,.. 然后你转换它,你如何构建你的数据集?但是,如果最终该类不支持克隆,那么您自己做应该不是很困难(再次放置相同的数据)......
    【解决方案2】:

    好的,这就是最终解决它的方法。我试图使用两个渲染器,一个用于灰带,一个用于虚线,但我只需要使用一个。

    所以最后的代码是:

    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);   
            }
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多