N 個のカテゴリに特定のシリーズの色を使用し、他の 1 つのカテゴリに別の色を使用する必要がある棒グラフを作成しようとしています。以下に例を示します。
モックアップでは、カテゴリ 1 ~ 3 は 5 色のコレクションを使用してシリーズをレンダリングし、カテゴリ 4 は単一の灰色を使用します。私の最初のアプローチは、カスタマイザー クラスを使用して getItemPaint() メソッドをオーバーライドすることでしたが、シリーズ レベルではなく、カテゴリ レベルで色を定義する方法しかわかりません。カテゴリやシリーズ レベルで色を定義することはできますか? 何かのようなもの、
If category != "Category4"
Use colors A, B, C, D, and E in category's series
Else
Use color F in category's series
もう 1 つの考えは、iReport の Series Colors 棒グラフ プロパティと getItemPaint() オーバーライドを組み合わせることです。そうすれば、iReport で使用する 5 つの色を定義し、カテゴリが「カテゴリ 4」に等しい場合にのみ getItemPaint() オーバーライドを使用できます。これまでのところ、この 2 つを組み合わせることはできませんでした。オーバーライドが定義されている場合、iReport の Series Color プロパティをオーバーライドします。
コードで更新:
import java.awt.Color;
import java.awt.Paint;
import net.sf.jasperreports.engine.JRAbstractChartCustomizer;
import net.sf.jasperreports.engine.JRChart;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.CategoryDataset;
public class CustomSeriesColors extends JRAbstractChartCustomizer {
static class CustomRenderer extends BarRenderer {
private final Paint[] colors1;
private final Paint[] colors2;
public CustomRenderer(Paint[] colors1, Paint[] colors2) {
this.colors1 = colors1;
this.colors2 = colors2;
}
//Set custom colors for series according to category
@Override
public Paint getItemPaint(int row, int column) {
CategoryDataset l_jfcDataset = getPlot().getDataset();
String l_rowKey = (String)l_jfcDataset.getRowKey(row);
String l_colKey = (String)l_jfcDataset.getColumnKey(column);
if ("Insufficient Data".equalsIgnoreCase(l_colKey)) {
return this.colors2[row % this.colors1.length];
} else {
return this.colors1[row % this.colors1.length];
}
}
}
public void customize(JFreeChart chart, JRChart jasperChart) {
// Get plot data.
CategoryPlot categoryPlot = chart.getCategoryPlot();
// Define colors to be used by series.
Color[] color1 = new Color[]{new Color(238,0,0), new Color(255,153,0), new Color(211,190,91), new Color(153,204,102), new Color(0,170,0)};
Color[] color2 = new Color[]{new Color(200,200,200)};
// Call CustomRenderer using defined color sets.
categoryPlot.setRenderer(new CustomRenderer(color1,color2));
}
}