Java 如何根据数据集中的值在JasperStudio中设置条形图中条形图的颜色?

Java 如何根据数据集中的值在JasperStudio中设置条形图中条形图的颜色?,java,jasper-reports,bar-chart,jfreechart,Java,Jasper Reports,Bar Chart,Jfreechart,我正在子报表中创建条形图。我将通过代码(nodeJS)完全构建的数据集传递给用户,它运行得非常好 现在我必须给相同的元素赋予相同的颜色(条形图中的条形图)。条形图中的元素数量是动态的,所以我不能静态地(我以前也是这样做的) 例如: 第1项始终为黑色 项目2始终为蓝色 第三项总是粉红色的 等等。当然,有时只有项目3,因此通常会为其指定标准系列“0”颜色。但我需要那个项目始终是粉红色的,无论它是第一个项目,第三个,等等 我来过这里,但我不知道如何走得更远。我找到了一些答案,但没有达到我想要的 p

我正在子报表中创建条形图。我将通过代码(nodeJS)完全构建的数据集传递给用户,它运行得非常好

现在我必须给相同的元素赋予相同的颜色(条形图中的条形图)。条形图中的元素数量是动态的,所以我不能静态地(我以前也是这样做的)

例如:

  • 第1项始终为黑色
  • 项目2始终为蓝色
  • 第三项总是粉红色的
等等。当然,有时只有项目3,因此通常会为其指定标准系列“0”颜色。但我需要那个项目始终是粉红色的,无论它是第一个项目,第三个,等等

我来过这里,但我不知道如何走得更远。我找到了一些答案,但没有达到我想要的

package com.efarmgroup.sina.sios4.jasper;


import java.awt.Color;
import net.sf.jasperreports.engine.JRChart;
import net.sf.jasperreports.engine.JRChartCustomizer;
import org.jfree.chart.JFreeChart;
import org.jfree.data.category.*;
import org.jfree.chart.renderer.category.*;
import java.util.HashMap;



public class customColorSeries implements JRChartCustomizer {


    @Override
    public void customize(JFreeChart chart, JRChart jasperChart) {

        //This is the list of the object. Each of them should have a standard color
        Object[] objectList = {"BULLONERIA", "FONDAZIONE o BASAMENTO", "SPALLE", "PILE", "PULVINI", "TRAVI",
                            "TRAVERSI", "IMPALCATI", "CORDOLI", "ARCHI", "APPARECCHI SPECIALI", "SISTEMAZIONE IDRAULICA",
                            "MURO", "APPOGGI", "BARRIERA", "GIUNTI", "Portale", "Piedritto sinistro", "Paramento sinistro",
                            "Volta", "Paramento destro", "Piedritto destro", "Sovrastruttura stradale",
                            "By Pass / Nicchia", "Elementi accessori"};



        // Category Plot: most commonly used to display bar chart
        // BarRenderer: create bar charts from data in a category dataset

        BarRenderer renderer = (BarRenderer) chart.getCategoryPlot().getRenderer();

        // Method required for reading the dataset.
        // Table of values that can be accessed using row and column keys.
        CategoryDataset cd = chart.getCategoryPlot().getDataset();

        // Row gives the series expression
        int rc = cd.getRowCount();
        for (int i = 0; i < rc; i++) {

            //Here I should retrieve the the value of the dataset to perform a simple if
        }
    }

}

颜色应基于数据集中的“对象名称”字段。

我的问题解决了,以下是我的解决方案:

public class customColorSeries  extends JRAbstractChartCustomizer  {

    @Override
    public void customize(JFreeChart chart, JRChart jasperChart) {

        BarRenderer renderer = (BarRenderer) chart.getCategoryPlot().getRenderer();
        CategoryDataset catDS = chart.getCategoryPlot().getDataset();
        com.fasterxml.jackson.databind.node.ArrayNode seriesColor = (ArrayNode) getParameterValue("seriesColor_P");
        HashMap<String, String> customMap = new HashMap<>();

        for (int z = 0; z < seriesColor.size(); z++) {  
            customMap.put(seriesColor.get(z).get("Object_Name").textValue(), seriesColor.get(z).get("Color").textValue());
        }

        for (int i = 0; i < catDS.getRowCount(); i++) {
            if(customMap.containsKey(catDS.getRowKey(i).toString())) {
                renderer.setSeriesPaint(i, Color.decode(customMap.get(catDS.getRowKey(i).toString())));
            }
        }
    }        
}
等等


作为子报表的参数。然后,我使用数据绑定和HashMap处理它,并在最后渲染它。

我的问题解决了,下面是我的解决方案:

public class customColorSeries  extends JRAbstractChartCustomizer  {

    @Override
    public void customize(JFreeChart chart, JRChart jasperChart) {

        BarRenderer renderer = (BarRenderer) chart.getCategoryPlot().getRenderer();
        CategoryDataset catDS = chart.getCategoryPlot().getDataset();
        com.fasterxml.jackson.databind.node.ArrayNode seriesColor = (ArrayNode) getParameterValue("seriesColor_P");
        HashMap<String, String> customMap = new HashMap<>();

        for (int z = 0; z < seriesColor.size(); z++) {  
            customMap.put(seriesColor.get(z).get("Object_Name").textValue(), seriesColor.get(z).get("Color").textValue());
        }

        for (int i = 0; i < catDS.getRowCount(); i++) {
            if(customMap.containsKey(catDS.getRowKey(i).toString())) {
                renderer.setSeriesPaint(i, Color.decode(customMap.get(catDS.getRowKey(i).toString())));
            }
        }
    }        
}
等等


作为子报表的参数。然后我使用数据绑定和HashMap来处理它,并在最后渲染它。

覆盖
getItemPaint()
,就像。@trashgood我在看你给我的链接的第一个问题。但有些事情我不清楚。他们使用基于y坐标的“返回(行>200)?Color.blue:Color.yellow”。但是有没有办法从数据集中检索特定字段?我只需要根据数据集“Object_Name”字段的值设置颜色。使用行和列访问数据集,例如。Override
getItemPaint()
,例如。@trashgood我正在查看您给我的链接的第一个问题。但有些事情我不清楚。他们使用基于y坐标的“返回(行>200)?Color.blue:Color.yellow”。但是有没有办法从数据集中检索特定字段?我只需要根据数据集“Object_Name”字段的值设置颜色。例如,使用行和列访问数据集。
{Object_Name: 'APPOGGI', Color: '#ff0000'} 
{Object_Name: 'SPALLE', Color: '#f2ca79'}