但是柱体的返回的值是10.1/50.1=20.2%,40.1/50.1=79.8%

这不符合预期目标,所以就去看了一下源码,在StandardCategoryItemLabelGenerator的父类AbstractCategoryItemLabelGenerator中发现有createItemArray这么一个方法:

可以发现柱体的标签值应该是由这个方法进行返回的,因此自己就对StandardCategoryItemLabelGenerator进行了继承,并重写了这个方法。
在ExtendedStandardCategoryItemLabelGeneratory中增加了isPercent作为标签值是显示百分比还是仅仅格式化的判断参数,并重写了createItemArray这个方法。

此时得到的效果如图:

然而,柱体的总值还是没有格式化。再看了一下ExtendedStackedBarRenderer这个类的代码,找到了totalFormat这个属性,将其值赋为new DecimalFormat("#0.0%")。测试:

基本是想要的最终结果,下面是测试代码
- <dependency>
- <groupId>jfree</groupId>
- <artifactId>jfreechart</artifactId>
- <version>1.0.13</version>
- </dependency>
ExtendedStackedBarRenderer
- package com.springapp.jfreechar;
-
- import java.awt.Color;
- import java.awt.Font;
- import java.awt.Graphics2D;
- import java.awt.geom.Rectangle2D;
- import java.text.DecimalFormat;
- import java.text.NumberFormat;
-
- import org.jfree.chart.axis.CategoryAxis;
- import org.jfree.chart.axis.ValueAxis;
- import org.jfree.chart.entity.CategoryItemEntity;
- import org.jfree.chart.entity.EntityCollection;
- import org.jfree.chart.labels.CategoryToolTipGenerator;
- import org.jfree.chart.plot.CategoryPlot;
- import org.jfree.chart.plot.PlotOrientation;
- import org.jfree.chart.renderer.category.CategoryItemRendererState;
- import org.jfree.chart.renderer.category.StackedBarRenderer;
- import org.jfree.data.category.CategoryDataset;
- import org.jfree.text.TextUtilities;
- import org.jfree.ui.TextAnchor;
-
- public class ExtendedStackedBarRenderer extends StackedBarRenderer {
-
- private static final long serialVersionUID = 1L;
- private boolean showPositiveTotal;
- private boolean showNegativeTotal;
- private Font totalLabelFont;
- private NumberFormat totalFormatter;
- public ExtendedStackedBarRenderer() {
- showPositiveTotal = true;
- showNegativeTotal = true;
- totalLabelFont = new Font("SansSerif", 1, 12);
- totalFormatter = new DecimalFormat("#0.0%");
- }
-
- /**
- * StackedBarRenderer 没有这个构造方法的,传入一个NumberFormat类,可以自定义实现每个柱体值显示格式
- * @param totalFormatter
- */
- public ExtendedStackedBarRenderer(NumberFormat totalFormatter) {
- showPositiveTotal = true;
- showNegativeTotal = true;
- totalLabelFont = new Font("SansSerif", 1, 12);
- this.totalFormatter = totalFormatter;
- }
-
- public NumberFormat getTotalFormatter() {
- return totalFormatter;
- }
-
- public void setTotalFormatter(NumberFormat numberformat) {
- if (numberformat == null) {
- throw new IllegalArgumentException("Null format not permitted.");
- } else {
- totalFormatter = numberformat;
- return;
- }
- }
-
- public void drawItem(Graphics2D graphics2d, CategoryItemRendererState categoryitemrendererstate, Rectangle2D rectangle2d, CategoryPlot categoryplot, CategoryAxis categoryaxis,
- ValueAxis valueaxis, CategoryDataset categorydataset, int i, int j, int k) {
- Number number = categorydataset.getValue(i, j);
- if (number ==