如何在 jaspersoft reports customizer for jFreeChart 中的单个 XYDataSet 上设置多个渲染器
How to set multiple Renderers on a single XYDataSet in jaspersoft reports customizer for jFreeChart
我们在 jaspersoft Reports Community Edition 中有一个 jfreechart,我们想在其中将两个渲染器应用于同一个数据集。我们当前使用的方法未按预期工作。
我们目前的方法如下,我们尝试将数据集从索引 0 复制到索引 1,然后为每个索引设置渲染器。
xyplot.setDataset( 1, xyplot.getDataset(0) );
xyplot.setRenderer( 1, XYLineAndShapeRenderer_DashedLines );
xyplot.setRenderer( 0, xYDifferenceRenderer_GrayBand );
我们没有收到任何错误,但这条线不是虚线,我们确实收到了灰色带,但没有正确绘制。
然而,当我们注释掉一个或另一个时,它们可以自己正常工作。
有点感觉第二个覆盖了第一个
这是在单个数据集上设置多个渲染器的正确方法吗?如果是这样,我们做错了什么?
或者应该采取不同的方法,如果是的话是什么?
为了使渲染器正常工作,您需要 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);
好的,这就是最终解决的方法。我试图使用两个渲染器,一个用于灰色带,一个用于虚线,但我只需要使用一个。
所以最终的代码是:
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);
}
}
}
这产生了灰色带和两侧虚线的预期结果:
我们在 jaspersoft Reports Community Edition 中有一个 jfreechart,我们想在其中将两个渲染器应用于同一个数据集。我们当前使用的方法未按预期工作。
我们目前的方法如下,我们尝试将数据集从索引 0 复制到索引 1,然后为每个索引设置渲染器。
xyplot.setDataset( 1, xyplot.getDataset(0) );
xyplot.setRenderer( 1, XYLineAndShapeRenderer_DashedLines );
xyplot.setRenderer( 0, xYDifferenceRenderer_GrayBand );
我们没有收到任何错误,但这条线不是虚线,我们确实收到了灰色带,但没有正确绘制。
然而,当我们注释掉一个或另一个时,它们可以自己正常工作。
有点感觉第二个覆盖了第一个
这是在单个数据集上设置多个渲染器的正确方法吗?如果是这样,我们做错了什么?
或者应该采取不同的方法,如果是的话是什么?
为了使渲染器正常工作,您需要 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);
好的,这就是最终解决的方法。我试图使用两个渲染器,一个用于灰色带,一个用于虚线,但我只需要使用一个。
所以最终的代码是:
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);
}
}
}
这产生了灰色带和两侧虚线的预期结果: