Jasper reports 如何在jaspersoft reports customizer for jFreeChart中的单个XYDataSet上设置多个渲染器

Jasper reports 如何在jaspersoft reports customizer for jFreeChart中的单个XYDataSet上设置多个渲染器,jasper-reports,jfreechart,Jasper Reports,Jfreechart,jaspersoft reports community edition中有一个jfreechart,我们希望对同一数据集应用两个渲染器。我们目前使用的方法没有按预期工作 我们当前的方法如下:尝试将数据集从索引0复制到索引1,然后为每个索引设置一个渲染器 xyplot.setDataset( 1, xyplot.getDataset(0) ); xyplot.setRenderer( 1, XYLineAndShapeRenderer_DashedLines ); xyplot.setRende

jaspersoft reports community edition中有一个jfreechart,我们希望对同一数据集应用两个渲染器。我们目前使用的方法没有按预期工作

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

xyplot.setDataset( 1, xyplot.getDataset(0) );
xyplot.setRenderer( 1, XYLineAndShapeRenderer_DashedLines );
xyplot.setRenderer( 0, xYDifferenceRenderer_GrayBand ); 
我们没有得到任何错误,但是线没有虚线,我们得到了灰色带,但是画得不正确

然而,当我们评论其中一个或另一个时,它们自己工作得很好

感觉第二个覆盖了第一个

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


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

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


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

最后的代码是:

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);   
        }
    }
}
这产生了灰色带和两侧虚线的预期结果:


谢谢您的回复。因此,XYPlot.getDataset(0)返回一个XYDataSet。DefaultXYDataSet有一个克隆方法,DefaultXYDataSet说它在doco中实现了XYDataset。但是当我尝试xyplot.setDataset(1,xyplot.getDataset(0.clone())时;我得到一个编译错误,类型XYDataset的方法clone()未定义。您知道如何克隆XYDataSet吗?很抱歉,我们已经调查了一些,请尝试((DefaultXYDataSet)xyplot.getDataset(0)).clone(),如果系列键(例如)不可克隆,则可能会失败。如果数据集不是DefaultXYDataSet的实例,则您需要自己创建克隆()。。。但我相信它是……好的,我会尝试一下,谢谢你的时间,彼得,我会让你知道这是否有效,并接受答案;-)好的,因此它不会将XYDataset强制转换为默认XYDataset。表示类型不兼容。XYDataset没有任何方法来设置值或克隆。。。所以我想新的问题是如何克隆XYDataSet?有了not setter,我甚至不能创建一个for循环来填充它。另外,XYDataSet是一个接口而不是一个类。。。所以我想我需要找出实现XYDataSet接口的类对象实际上被传递了。。。就像它可能是一个XYSeriesCollection。。。我将在早上对此进行一些测试。Tyr以了解您使用的是哪个类className()。,。。然后您将其转换,如何构造数据集?。但是,如果最终该类不支持克隆,那么您自己进行克隆应该不是很困难(再次放置相同的数据)。。。。
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);   
        }
    }
}