java - 如何根据数据集中的值设置 JasperStudio 中 barChart 中条形的颜色?

标签 java jasper-reports bar-chart jfreechart

我正在子报表中创建条形图。我传递了完全通过代码(nodeJS)构建的数据集,它工作得很好。

现在我必须始终为相同的元素提供相同的颜色(条形图中的条形)。 barChart 中的元素数量是动态的,因此我不能将其静态化(我之前是这样做的)。

例如:

  • 第 1 项始终为黑色;
  • 第 2 项始终为蓝色;
  • 第 3 项始终为粉色。

等等。当然,也有可能只有第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
        }
    }

}


这是子数据集的简单示例

evolution_data: 
  [

     { Building_ID: 1,
       Building_Code: 'F010',
       Building_Name: 'Quiliano',
       Evaluation: 50,
       Object_Name: 'APPOGGI',
       Span_Code: 1,
       seriesOrder: 0,
       color: '#FC6D79' },
     { Building_ID: 1,
       Building_Code: 'F010',
       Building_Name: 'Quiliano',
       Evaluation: 8,
       Object_Name: 'BARRIERA',
       Span_Code: 1,
       seriesOrder: 0,
       color: '#FC6D79' },
     { Building_ID: 1,
       Building_Code: 'F010',
       Building_Name: 'Quiliano',
       Evaluation: 5,
       Object_Name: 'APPOGGI',
       Span_Code: 2,
       seriesOrder: 1,
       color: '#A64186' },
     { Building_ID: 1,
       Building_Code: 'F010',
       Building_Name: 'Quiliano',
       Evaluation: 3,
       Object_Name: 'BARRIERA',
       Span_Code: 2,
       seriesOrder: 1,
       color: '#A64186' },
     { Building_ID: 1,
       Building_Code: 'F010',
       Building_Name: 'Quiliano',
       Evaluation: 0,
       Object_Name: 'APPOGGI',
       Span_Code: 3,
       seriesOrder: 2,
       color: '#9758C4' },
     { Building_ID: 1,
       Building_Code: 'F010',
       Building_Name: 'Quiliano',
       Evaluation: 0,
       Object_Name: 'BARRIERA',
       Span_Code: 3,
       seriesOrder: 2,
       color: '#9758C4' }]

颜色应基于数据集中的“Object_Name”字段。

最佳答案

我的问题已经解决了,这是我的解决方案:

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())));
            }
        }
    }        
}

我发送一个对象数组,其中每个对象都是这样构建的

{Object_Name: 'APPOGGI', Color: '#ff0000'} 
{Object_Name: 'SPALLE', Color: '#f2ca79'}

等等......

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

关于java - 如何根据数据集中的值设置 JasperStudio 中 barChart 中条形的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57256811/

相关文章:

java - 使用什么 Intent 将多任务列表从 Action Memo 应用程序发送到 S Planner 应用程序?

java - 想用Struts2开发JasperReport

java - JasperReports 类路径

python matplotlib Canvas 未调整大小

javascript - 使用 d3,如何创建直方图或条形图,其中最后一个条形是大于某个数字的所有值的计数?

java - Java 中的图像调整大小会导致某些 JPG 损坏

java - 如何使用复杂类型的 javax.persistence.criteria.Predicate?

excel - JasperReports 中每个工作表属性一页

python - 使用 plotly 在条形图上传播值

java - 导入Android Listview通过pull刷新,项目属性错误