当前位置:Gxlcms > 数据库问题 > JFreeChart之堆叠柱形图(StackedBar)

JFreeChart之堆叠柱形图(StackedBar)

时间:2021-07-01 10:21:17 帮助过:2人阅读

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. * StackedBarRenderer 没有这个构造方法的,传入一个NumberFormat类,可以自定义实现每个柱体值显示格式 
    38. * @param totalFormatter 
    39. */ 
    40. public ExtendedStackedBarRenderer(NumberFormat totalFormatter)
    41. showPositiveTotal = true
    42. showNegativeTotal = true
    43. totalLabelFont = new Font("SansSerif", 1, 12); 
    44. this.totalFormatter = totalFormatter; 

    45.  
    46. public NumberFormat getTotalFormatter()
    47. return totalFormatter; 

    48.  
    49. public void setTotalFormatter(NumberFormat numberformat)
    50. if (numberformat == null) { 
    51. throw new IllegalArgumentException("Null format not permitted."); 
    52. } else
    53. totalFormatter = numberformat; 
    54. return


    55.  
    56. public void drawItem(Graphics2D graphics2d, CategoryItemRendererState categoryitemrendererstate, Rectangle2D rectangle2d, CategoryPlot categoryplot, CategoryAxis categoryaxis, 
    57. ValueAxis valueaxis, CategoryDataset categorydataset, int i, int j, int k)
    58. Number number = categorydataset.getValue(i, j); 
    59. if (number ==

    人气教程排行