Java iReport/jFreeChart-组合getItemPaint()覆盖和系列颜色

Java iReport/jFreeChart-组合getItemPaint()覆盖和系列颜色,java,jasper-reports,ireport,jfreechart,series,Java,Jasper Reports,Ireport,Jfreechart,Series,我正在尝试创建一个条形图,它需要为N个类别使用特定的系列颜色,为1个其他类别使用单独的颜色。以下是一个例子: 在实体模型中,类别1-3使用5种颜色的集合来渲染其系列,而类别4使用单个灰色。我的第一种方法是使用customizer类重写getItemPaint()方法,但我只能在类别级别(而不是系列级别)上定义颜色。是否可以在类别和/或系列级别定义颜色?大概 If category != "Category4" Use colors A, B, C, D, and E in catego

我正在尝试创建一个条形图,它需要为N个类别使用特定的系列颜色,为1个其他类别使用单独的颜色。以下是一个例子:

在实体模型中,类别1-3使用5种颜色的集合来渲染其系列,而类别4使用单个灰色。我的第一种方法是使用customizer类重写getItemPaint()方法,但我只能在类别级别(而不是系列级别)上定义颜色。是否可以在类别和/或系列级别定义颜色?大概

If category != "Category4"
    Use colors A, B, C, D, and E in category's series
Else
    Use color F in category's series
我的另一个想法是将iReport的Series Color条形图属性和getItemPaint()覆盖结合起来;这样,我就可以定义iReport中要使用的5种颜色,并仅在类别等于“category 4”的情况下使用getItemPaint()覆盖。到目前为止,我还没有把两者结合起来的运气;如果定义了替代,它将替代iReport的“系列颜色”属性

更新代码:

导入java.awt.Color;
导入java.awt.Paint;
导入net.sf.jasperreports.engine.jractChartCustomizer;
导入net.sf.jasperreports.engine.JRChart;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.axis.NumberAxis;
导入org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
导入org.jfree.chart.plot.CategoryPlot;
导入org.jfree.chart.renderer.category.derer;
导入org.jfree.data.category.CategoryDataset;
公共类CustomSeriesColor扩展了JRactChartCustomizer{
静态类CustomRenderer扩展了Derrer{
私人最终油漆[]颜色1;
私人最终油漆[]颜色2;
公共自定义渲染器(绘制[]颜色1,绘制[]颜色2){
this.colors1=colors1;
this.colors2=colors2;
}
//根据类别设置系列的自定义颜色
@凌驾
公共绘制getItemPaint(int行,int列){
CategoryDataset l_jfcDataset=getPlot().getDataset();
字符串l_rowKey=(字符串)l_jfcDataset.getRowKey(行);
String l_colKey=(String)l_jfcDataset.getColumnKey(column);
如果(“数据不足”。相等信号情况(l_colKey)){
返回this.colors2[行%this.colors1.length];
}否则{
返回this.colors1[行%this.colors1.length];
}
}
}
公共void自定义(JFreeChart图表、JRChart jasperChart){
//获取绘图数据。
CategoryPlot CategoryPlot=chart.getCategoryPlot();
//定义系列要使用的颜色。
颜色[]颜色1=新颜色[]{新颜色(238,0,0)、新颜色(255153,0)、新颜色(211190,91)、新颜色(153204102)、新颜色(0170,0)};
Color[]color2=新颜色[]{new Color(200200)};
//使用定义的颜色集调用CustomRenderer。
setRenderer(新的CustomRenderer(color1,color2));
}
}

您需要编写一个自定义渲染器,通过覆盖
getItemPaint

@覆盖
公共绘制getItemPaint(int系列,int类别){
如果(类别==4)
返回this.colors2[系列%this.colors1.length];
其他的
返回this.colors1[系列%this.colors1.length];
}
将渲染器更新用于打印:

Color[]color1=新颜色[]{Color.red,Color.green,Color.blue};
Color[]color2=新颜色[]{Color.gray,Color.gray.darker()};
setRenderer(新的CustomRenderer(color1,color2));

这是完整的代码

导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Paint;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.axis.NumberTickUnit;
导入org.jfree.chart.axis.SymbolAxis;
导入org.jfree.chart.plot.CategoryPlot;
导入org.jfree.chart.plot.PlotOrientation;
导入org.jfree.chart.renderer.category.derer;
导入org.jfree.data.category.CategoryDataset;
导入org.jfree.data.category.DefaultCategoryDataset;
导入org.jfree.ui.ApplicationFrame;
导入org.jfree.ui.RefineryUtilities;
公共类BarChartDemo7扩展了ApplicationFrame{
静态类CustomRenderer扩展了Derrer{
私人最终油漆[]颜色1;
私人最终油漆[]颜色2;
公共自定义渲染器(绘制[]颜色1,绘制[]颜色2){
this.colors1=colors1;
this.colors2=colors2;
}
@凌驾
公共绘制getItemPaint(int系列,int类别){
如果(类别==4)
返回this.colors2[系列%this.colors1.length];
其他的
返回this.colors1[系列%this.colors1.length];
}
}
公共条形图Demo7(字符串标题){
超级(标题);
CategoryDataset dataSet=createDataset();
JFreeChart chart=createChart(数据集);
ChartPanel面板=新的ChartPanel(图表);
面板。设置首选尺寸(新尺寸(800800));
设置内容窗格(面板);
}
私有静态CategoryDataset createDataset(){
//行键。。。
最终字符串序列1=“ABC”;
最终字符串序列2=“XYZ”;
//列键。。。
最终字符串类别1=“A”;
最终字符串类别2=“B”;
最终字符串类别3=“C”;
最终字符串类别4=“D”;
最终字符串类别5=“E”;
最终字符串类别6=“F”;
//创建数据集。。。
最终DefaultCategoryDataset数据集=新的DefaultCategoryDataset();
dataset.addValue(35,系列1,类别1);
dataset.addValue(37,系列1,类别2);
dataset.addValue(40,系列1,类别3);
dataset.addValue(52,系列1,类别4);
dataset.addValue(52,系列1,类别5);
dataset.addValue(52,系列1,类别6);
dataset.addValue(30,系列2,c