输入banner图图片脚本导航/分类

JFreeChart之堆叠柱形图(StackedBar)

extendedstackedbarrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{3}", 
  • NumberFormat.getPercentInstance(), new DecimalFormat("#0.0%"))); 
  •  
  • 但是柱体的返回的值是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%")。测试:
    技术分享
    基本是想要的最终结果,下面是测试代码

    1. <dependency> 
    2. <groupId>jfree</groupId> 
    3. <artifactId>jfreechart</artifactId> 
    4. <version>1.0.13</version> 
    5. </dependency> 

    ExtendedStackedBarRenderer

    1. package com.springapp.jfreechar; 
    2.  
    3. import java.awt.Color; 
    4. import java.awt.Font; 
    5. import java.awt.Graphics2D; 
    6. import java.awt.geom.Rectangle2D; 
    7. import java.text.DecimalFormat; 
    8. import java.text.NumberFormat; 
    9.  
    10. import org.jfree.chart.axis.CategoryAxis; 
    11. import org.jfree.chart.axis.ValueAxis; 
    12. import org.jfree.chart.entity.CategoryItemEntity; 
    13. import org.jfree.chart.entity.EntityCollection; 
    14. import org.jfree.chart.labels.CategoryToolTipGenerator; 
    15. import org.jfree.chart.plot.CategoryPlot; 
    16. import org.jfree.chart.plot.PlotOrientation; 
    17. import org.jfree.chart.renderer.category.CategoryItemRendererState; 
    18. import org.jfree.chart.renderer.category.StackedBarRenderer; 
    19. import org.jfree.data.category.CategoryDataset; 
    20. import org.jfree.text.TextUtilities; 
    21. import org.jfree.ui.TextAnchor; 
    22.  
    23. public class ExtendedStackedBarRenderer extends StackedBarRenderer { 
    24.  
    25. private static final long serialVersionUID = 1L; 
    26. private boolean showPositiveTotal; 
    27. private boolean showNegativeTotal; 
    28. private Font totalLabelFont; 
    29. private NumberFormat totalFormatter; 
    30. public ExtendedStackedBarRenderer() { 
    31. showPositiveTotal = true; 
    32. showNegativeTotal = true; 
    33. totalLabelFont = new Font("SansSerif", 1, 12); 
    34. totalFormatter = new DecimalFormat("#0.0%"); 
    35. } 
    36.  
    37. /** 
    38. * StackedBarRenderer 没有这个构造方法的,传入一个NumberFormat类,可以自定义实现每个柱体值显示格式 
    39. * @param totalFormatter 
    40. */ 
    41. public ExtendedStackedBarRenderer(NumberFormat totalFormatter) { 
    42. showPositiveTotal = true; 
    43. showNegativeTotal = true; 
    44. totalLabelFont = new Font("SansSerif", 1, 12); 
    45. this.totalFormatter = totalFormatter; 
    46. } 
    47.  
    48. public NumberFormat getTotalFormatter() { 
    49. return totalFormatter; 
    50. } 
    51.  
    52. public void setTotalFormatter(NumberFormat numberformat) { 
    53. if (numberformat == null) { 
    54. throw new IllegalArgumentException("Null format not permitted."); 
    55. } else { 
    56. totalFormatter = numberformat; 
    57. return; 
    58. } 
    59. } 
    60.  
    61. public void drawItem(Graphics2D graphics2d, CategoryItemRendererState categoryitemrendererstate, Rectangle2D rectangle2d, CategoryPlot categoryplot, CategoryAxis categoryaxis, 
    62. ValueAxis valueaxis, CategoryDataset categorydataset, int i, int j, int k) { 
    63. Number number = categorydataset.getValue(i, j); 
    64. if (number ==