Как отобразить значение бара для каждого бара в гистограмме? - PullRequest
4 голосов
/ 28 февраля 2011

Необходимо увидеть точное значение, которое представляет гистограмма на гистограмме, а не приблизительное значение на оси Y.

Как это можно сделать?

Спасибо за чтение!

1 Ответ

9 голосов
/ 02 марта 2011

В iReport 3.7.6 вы можете просто установить флажок «Показать метки» в свойствах BarPlot.

В предыдущей версии (3.1.4) мне нужно было создать класс ChartCustomizer.

Если вам нужно отформатировать число в метке (например, в процентах, добавить разделитель тысяч и т. Д.)), то вам обязательно нужен ChartCustomizer, даже в новой версии.

Простой пример:

import java.text.NumberFormat;

import net.sf.jasperreports.engine.JRChart;
import net.sf.jasperreports.engine.JRChartCustomizer;

import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.AbstractCategoryItemLabelGenerator;
import org.jfree.chart.labels.CategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.CategoryDataset;


public class SimpleBarChartCustomizer implements JRChartCustomizer {

    public void customize(JFreeChart chart, JRChart jasperChart) {
        CategoryPlot plot = chart.getCategoryPlot();
        BarRenderer renderer = (BarRenderer) plot.getRenderer();

        CategoryItemRenderer catRenderer = ((CategoryItemRenderer)renderer);
        catRenderer.setBaseItemLabelGenerator(new NumberLabelGenerator("", NumberFormat.getInstance()));

    }

    static class NumberLabelGenerator extends AbstractCategoryItemLabelGenerator implements CategoryItemLabelGenerator {
        public NumberLabelGenerator(String labelFormat,
                NumberFormat formatter, NumberFormat percentFormatter) {
            super(labelFormat, formatter, percentFormatter);
        }

        protected NumberLabelGenerator(String labelFormat,  NumberFormat formatter) {
            super(labelFormat, formatter);
        }

        private NumberFormat formatter = NumberFormat.getInstance();

        public String generateLabel(CategoryDataset dataset, int series, int category) {
            Number b = dataset.getValue(series, category);
            formatter.setMaximumFractionDigits(2);
            return formatter.format(b);
        }

    }
}
...