带有 Jasper Report 条形图的条形顶部的自定义值标签

Custom value labels on top of bars with Jasper Report bar charts

我在 Jasper Studio 中定义了一个条形图,它生成了这样的结果:

条形顶部的值重叠。我想要:

我不确定,但我认为 Jasper Studio 不允许对其进行配置。

我看过代码实现 JRChartCustomizer 但我不知道如何修改标签的文本或位置。

编辑

我试过这种方法:

    public void customize(JFreeChart fc, JRChart jrc) {
    
    CategoryPlot catPlot = fc.getCategoryPlot();
    
    if (jrc.getDataset() instanceof JRFillChartDataset) {
        JRFillChartDataset jrFillChartDataset = (JRFillChartDataset) jrc.getDataset();

        CategoryLabelGenerator categoryLabelGenerator = (CategoryLabelGenerator) jrFillChartDataset.getLabelGenerator();
        categoryLabelGenerator.getNumberFormat().setMaximumFractionDigits(1);

但是没有用,因为 getLabelGenerator() 在每次调用时都会创建一个新的 CategoryLabelGenerator,因此为其 NumberFormat 实例设置值毫无意义。

最后我是这样得到的:

@Override
public void customize(JFreeChart fc, JRChart jrc) {
    
    CategoryPlot catPlot = fc.getCategoryPlot();

    
    final CategoryItemRenderer renderer = catPlot.getRenderer();
    Font font = renderer.getBaseItemLabelFont();
    Font font2 = font.deriveFont(3f);
    renderer.setBaseItemLabelFont(font2);
    
    renderer.setBaseItemLabelGenerator(new CategoryLabelGenerator(null) {
        private static final long serialVersionUID = 549073036018846176L;

        @Override
        public String generateLabel(CategoryDataset dataset, int row, int column) {
            Number value = dataset.getValue(row, column);
            
            if (value != null) {
                
                NumberFormat nf = NumberFormat.getPercentInstance();
                nf.setMinimumIntegerDigits(1);
                nf.setMaximumFractionDigits(2);
                
                return nf.format(value.doubleValue() / 100);
            }
            
            return null;
        }
    });
}