Search code examples
jasper-reportsjfreechart

Jasper Report Chart manipulate labelExpression


For Jasper Report 4.5

How can I access bar chart label expression? I have tried ChartCustomizer, we can access label via SeriesItemLabelGenerator. But when this generator executes, it does not have formula we have set on jrxml file for <labelExpression> field e.g. [barValue$ColorCode$]. I found that <labelExpression> are been executed in CategoryLabelGenerator class, which is JasperReport class.

What I want to achieve is I am passing color code from dataset along with bar value with format [barValue$ColorCode$]. I want to pick $ColorCode$ and get that value and then change label value to [barValue]. ColorCode will be used to assign bar color from ChartCustomizer. But thing is when I access labelExpression from StandardCategoryItemLabelGenerator or AbstractCategoryItemLabelGenerator then it does returns [barValue] from generateLabelString() and generateLabel() method.

Only intention is to use ColorCode passed from dataset. If we only pass ColorCode instead of [barValue$ColorCode$], then only report shows [barValue] only. I think that we can customize CategoryLabelGenerator class then it would solve my problem. But I don't know how can we customize CategoryLabelGenerator.

Any input/help achieving this goal is greatly appreciated.

Thank you.


Solution

  • After some digging in to source code of JasperReport and jFreeChart documentations found a way to achieve this goal. Writing code down here. Implemented JRChartCustomizer interface.

    public void customize(JFreeChart chart, JRChart jasperChart) {
    
        CategoryPlot plot = chart.getCategoryPlot();
    
        CategoryDataset dataset = plot.getDataset();
    
        CategoryLabelGenerator categoryLabelGenerator = null;
    
        if (jasperChart.getDataset() instanceof JRFillChartDataset) {
            JRFillChartDataset jrFillChartDataset = (JRFillChartDataset) jasperChart.getDataset();
    
            categoryLabelGenerator = (CategoryLabelGenerator) jrFillChartDataset.getLabelGenerator();
        }
    
        if (categoryLabelGenerator != null) {
            for (int i = 0; i < dataset.getRowCount(); i++) {
                for (int j = 0; j < dataset.getColumnCount(); j++) {
                    String generatedLabel = categoryLabelGenerator.generateLabel(dataset, i, j);
                }
            }
        }
    }