JfreeChar 画横向柱状图

[java]  view plain copy
  1. public class FinancePlot extends Plot implements Cloneable, Serializable {  
  2.   
  3.     /** 
  4.      *  
  5.      */  
  6.     private static final long serialVersionUID = 1L;  
  7.       
  8.     /** The default grid line stroke. */  
  9.     public static final Stroke DEFAULT_GRIDLINE_STROKE = new BasicStroke(0.5f,  
  10.             BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0.0f, new float[]   
  11.             {2.0f, 2.0f}, 0.0f);  
  12.   
  13.     /** The default grid line paint. */  
  14.     private Color DEFAULT_GRIDLINE_PAINT = Color.lightGray;  
  15.     private Color DEFAULT_GREENLINE_PAINT = new Color(213,249,254);  
  16.   
  17.     /** The default value label font. */  
  18.     private Font DEFAULT_VALUE_LABEL_FONT = new Font("SansSerif", Font.PLAIN, 18);  
  19.       
  20.     private Color DEFAULT_VALUE_LABEL_COLOR = Color.BLACK;  
  21.       
  22.     /** The default font for titles. */  
  23.     public static final Font DEFAULT_TITLE_FONT = new Font("SansSerif", Font.BOLD, 18);  
  24.       
  25.     public static final int DEFAULT_MARGIN = 5;  
  26.     /**每根柱子的高度*/  
  27.     private static final int DEFAULT_BAR_HEIGHT = 20;  
  28.     /**每根柱子的宽度*/  
  29.     private static final int DEFAULT_BAR_WIDTH = 320;  
  30.     /**标签宽度*/  
  31.     private static final int DEFAULT_LABEL_WIDTH = 100;  
  32.     /**标签高度*/  
  33.     private static final int DEFAULT_LABEL_HEIGHT = 70;  
  34.       
  35.     /**图型数据集合*/  
  36.     private List<Finance> dataset;  
  37.     /**地区*/  
  38.     private String district_name;  
  39.     /**柱子标签标题*/  
  40.     private String labelTitle = null;  
  41.     /**被除数标题*/  
  42.     private String dividendTitle = null;  
  43.     /**除数标题*/  
  44.     private String divisorTitle = null;  
  45.       
  46.     /** 
  47.      * 财务报表图 
  48.      * @param dataset 当前财务数据 
  49.      * @param title1 柱子标签标题 
  50.      * @param title2 被除数标题 
  51.      * @param title3 除数标题 
  52.      */  
  53.     public FinancePlot(List<Finance> dataset,String title1,String title2,String title3){  
  54.         setDataset(dataset);  
  55.         setDistrict_name(district_name);  
  56.         setLabelTitle(title1);  
  57.         setDividendTitle(title2);  
  58.         setDivisorTitle(title3);  
  59.     }  
  60.       
  61.      public void draw(Graphics2D g2, Rectangle2D area,   
  62.              Point2D anchor,  
  63.              PlotState parentState,  
  64.              PlotRenderingInfo state) {  
  65.          // don't let anyone draw outside the data area  
  66.             Shape savedClip = g2.getClip();  
  67.             g2.setStroke(new BasicStroke(1.0f));  
  68.             g2.clip(area);  
  69.             g2.setFont(DEFAULT_VALUE_LABEL_FONT);  
  70.             //画白色背景  
  71.             g2.fillRect((int)area.getX(), (int)area.getY(), (int)area.getWidth(), (int)area.getHeight());  
  72.             //画图例  
  73.             int x = getDEFAULT_MARGIN();  
  74.             int y = getDEFAULT_MARGIN();  
  75.             if(getLegendColor()!=null){  
  76.                 createLegend(g2);  
  77.                 x = getDEFAULT_MARGIN();  
  78.                 y = 45;  
  79.             }  
  80.               
  81.             //画三个标题{指标,指标排名,企业总数}  
  82.             g2.setColor(DEFAULT_VALUE_LABEL_COLOR);  
  83.             if(getLabelTitle()!=null){  
  84.                 g2.drawString(getLabelTitle(), x, y);  
  85.             }  
  86.             if(getDividendTitle()!=null){  
  87.                 x = 100+(340-calcStringWidth(g2,DEFAULT_VALUE_LABEL_FONT,getDividendTitle()))/2;  
  88.                 g2.drawString(getDividendTitle(), x, y);  
  89.             }  
  90.            if(getDivisorTitle()!=null){  
  91.                x = 520+((50-calcStringWidth(g2,DEFAULT_VALUE_LABEL_FONT,getDivisorTitle()))/2);  
  92.                g2.drawString(getDivisorTitle(), x, y);  
  93.            }  
  94.               
  95.             //画指标排名矩形框  
  96.             x = 70;  
  97.             y = y + 30;  
  98. //          g2.setColor(DEFAULT_GREENLINE_PAINT);  
  99. //          g2.drawString("", x, 620);  
  100.               
  101.             //画指企业总数矩形框  
  102.             x = 625;  
  103. //          g2.setColor(DEFAULT_GREENLINE_PAINT);  
  104. //          g2.drawString("", x, 85);  
  105.               
  106.             //画后四项的标尺刻度  
  107.             for(int i = 1; i < dataset.size(); i++){  
  108.                 g2.setColor(DEFAULT_VALUE_LABEL_COLOR);  
  109.                 //画标尺的横线  
  110.                 g2.drawLine(70, (y+95*i)+10400, (y+95*i)+10);  
  111.                 //画标尺的刻度线,小竖线高度5  
  112.                 g2.drawLine(70, (y+95*i)+1070, (y+95*i)+5);  
  113.                 g2.drawString("100%"70, (y+95*i));  
  114.                   
  115.                 for(int n = 2; n <= 4; n++){  
  116.                     g2.setColor(DEFAULT_VALUE_LABEL_COLOR);  
  117.                     g2.drawString((100-25*(n-1))+"%"95+80*(n-1), (y+95*i));  
  118.                     g2.drawLine(95+80*(n-1), (y+95*i)+1095+80*(n-1), (y+95*i)+5);               
  119.                 }  
  120.                   
  121.                 g2.setColor(DEFAULT_VALUE_LABEL_COLOR);  
  122.                 g2.drawString("0%"400, (y+95*i));               
  123.                 g2.drawLine(400, (y+95*i)+10400, (y+95*i)+5);  
  124.             }  
  125.             
  126.               
  127.               
  128.             //画柱子标签、柱子及柱子值  
  129.             Map<String,Color> legendColor = getLegendColor();  
  130.             x = 70;  
  131.             g2.setStroke(new BasicStroke(1));  
  132.               
  133.             for(int i = 0;i < dataset.size(); i++){  
  134.                 Finance finance = dataset.get(i);  
  135.                 int j =0;  
  136.                 //循环得到一个小柱形图  
  137.                 for(String key : legendColor.keySet()){  
  138.                     //标签  
  139.                     g2.setColor(DEFAULT_VALUE_LABEL_COLOR);  
  140.                     TextUtils.drawMultiLineText(finance.getLabel(), g2, this.DEFAULT_VALUE_LABEL_FONT, 65new Point2D.Double(getDEFAULT_MARGIN(), (y+95*i)+25));  
  141.                     //计算柱形长度  
  142.                     int w = 360;  
  143.                     if(finance.getDivsior(key)!=null && finance.getDivsior(key).intValue()!=0 && finance.getDividend(key)!=null){  
  144.                         w = new BigDecimal(1).subtract(finance.getDividend(key).divide(finance.getDivsior(key),2, RoundingMode.HALF_UP)).multiply(new BigDecimal(320)).intValue();  
  145.                     }  
  146.                     //画柱子  
  147.                     g2.setColor(Color.WHITE);  
  148.                     g2.drawRect(x, (y+95*i)+20*j+15, w, getDEFAULT_BAR_HEIGHT());  
  149.                     //将矩形填充为颜色  
  150.                     g2.setColor(finance.getLegend_color().get(key));  
  151.                     g2.fillRect(x, (y+95*i)+20*j+15, w, getDEFAULT_BAR_HEIGHT());  
  152.                     //画间隔  
  153.                     g2.setColor(Color.WHITE);  
  154.                     g2.drawRect(x, (y+95*i)+20*j+15, w, 2);  
  155.                     //将矩形填充为颜色  
  156.                     g2.setColor(Color.WHITE);  
  157.                     g2.fillRect(x, (y+95*i)+20*j+15, w, 2);  
  158.                       
  159. //                  //画柱子值  
  160.                     g2.setColor(DEFAULT_VALUE_LABEL_COLOR);  
  161.                     if(finance.getDividend(key)!=null){  
  162.                         g2.drawString(finance.getDividend(key).intValue()+"", x+w+2, (y+95*i)+20*(j+1)+10);  
  163.                     }  
  164.                     //画柱子除数值  
  165.                     if(finance.getDivsior(key)!=null){  
  166.                         g2.drawString(finance.getDivsior(key).intValue()+""530, (y+95*i)+20*(j+1)+10);  
  167.                     }  
  168.                     j++;  
  169.                 }  
  170.             }  
  171.             //画最上面的刻度尺  
  172.             g2.drawLine(70, y+10400, y+10);   
  173.             g2.setColor(DEFAULT_VALUE_LABEL_COLOR);  
  174.             g2.drawLine(x, y+10, x, y+5);  
  175.             g2.drawString("100%", x, y-5);  
  176.             for(int i = 2; i <= 4; i++){  
  177.                 g2.setColor(DEFAULT_VALUE_LABEL_COLOR);  
  178.                 g2.drawString((100-25*(i-1))+"%"70+80*(i-1), y-5);  
  179.                 g2.drawLine(70+80*(i-1), y+1070+80*(i-1), y+5);                 
  180.             }  
  181.             g2.setColor(DEFAULT_VALUE_LABEL_COLOR);  
  182.             g2.drawLine(400, y+10400, y+5);  
  183.             g2.drawString("0%"400, y-5);  
  184.             g2.setClip(savedClip);            
  185.     }  
  186.        
  187.      private void createLegend(Graphics2D g2){  
  188.          int x = getDEFAULT_MARGIN();  
  189.          int y = getDEFAULT_MARGIN();  
  190.          Map<String,Color> legendColor = getLegendColor();  
  191.          for(String key : legendColor.keySet()){  
  192.              //画一个矩形  
  193.              g2.setColor(legendColor.get(key));  
  194.              g2.drawRect(x, y, 2010);  
  195.              //将矩形填充颜色  
  196.              g2.fillRect(x, y, 2010);  
  197.              x = x + 20;  
  198.              //画图例标签  
  199.              g2.setColor(DEFAULT_VALUE_LABEL_COLOR);  
  200.              g2.drawString(key, x+10, y+10);  
  201.              //计算图例标签的宽度+图例间隔30  
  202.              x = x + calcStringWidth(g2,DEFAULT_VALUE_LABEL_FONT,key) + 30;  
  203.          }  
  204.      }  
  205.        
  206.      private int calcStringWidth(Graphics2D g2,Font ft,String title){  
  207.          FontMetrics fm = g2.getFontMetrics(ft);  
  208.          Rectangle2D textBound = TextUtilities.getTextBounds(title,g2,fm);  
  209.          return (int)textBound.getWidth();  
  210.      }  
  211.   
  212.   
  213.   
  214.     @Override  
  215.     public String getPlotType() {  
  216.         return "Finace Plot";  
  217.     }  
  218.   
  219.     public static int getDEFAULT_BAR_HEIGHT() {  
  220.         return DEFAULT_BAR_HEIGHT;  
  221.     }  
  222.   
  223.     public static int getDEFAULT_BAR_WIDTH() {  
  224.         return DEFAULT_BAR_WIDTH;  
  225.     }  
  226.   
  227.     public static Stroke getDEFAULT_GRIDLINE_STROKE() {  
  228.         return DEFAULT_GRIDLINE_STROKE;  
  229.     }  
  230.   
  231.     public static int getDEFAULT_LABEL_HEIGHT() {  
  232.         return DEFAULT_LABEL_HEIGHT;  
  233.     }  
  234.   
  235.     public static int getDEFAULT_LABEL_WIDTH() {  
  236.         return DEFAULT_LABEL_WIDTH;  
  237.     }  
  238.   
  239.     public static int getDEFAULT_MARGIN() {  
  240.         return DEFAULT_MARGIN;  
  241.     }  
  242.   
  243.     public static Font getDEFAULT_TITLE_FONT() {  
  244.         return DEFAULT_TITLE_FONT;  
  245.     }  
  246.   
  247.     public void setDataset(List<Finance> dataset) {  
  248.         this.dataset = dataset;  
  249.     }  
  250.   
  251.     public void setDistrict_name(String district_name) {  
  252.         this.district_name = district_name;  
  253.     }  
  254.   
  255.     public void setDividendTitle(String dividendTitle) {  
  256.         this.dividendTitle = dividendTitle;  
  257.     }  
  258.   
  259.     public void setDivisorTitle(String divisorTitle) {  
  260.         this.divisorTitle = divisorTitle;  
  261.     }  
  262.   
  263.     public void setLabelTitle(String labelTitle) {  
  264.         this.labelTitle = labelTitle;  
  265.     }  
  266.   
  267.     public String getDividendTitle() {  
  268.         return dividendTitle;  
  269.     }  
  270.   
  271.     public String getDivisorTitle() {  
  272.         return divisorTitle;  
  273.     }  
  274.   
  275.     public String getLabelTitle() {  
  276.         return labelTitle;  
  277.     }  
  278.       
  279.     private Map<String,Color> getLegendColor(){  
  280.         Map<String,Color> legendColor = null;  
  281.         if(dataset!=null){  
  282.             legendColor = new LinkedHashMap<String,Color>();  
  283.             for(int i=0; i<dataset.size(); i++){  
  284.                 Finance finance = dataset.get(i);  
  285.                 if(finance==null || finance.getLegend_color()==nullcontinue;  
  286.                   
  287.                 legendColor.putAll(finance.getLegend_color());  
  288.             }  
  289.         }  
  290.         return legendColor;  
  291.     }  
  292.   
  293.     public void setDEFAULT_GRIDLINE_PAINT(Color default_gridline_paint) {  
  294.         DEFAULT_GRIDLINE_PAINT = default_gridline_paint;  
  295.     }  
  296.   
  297.     public void setDEFAULT_VALUE_LABEL_FONT(Font default_value_label_font) {  
  298.         DEFAULT_VALUE_LABEL_FONT = default_value_label_font;  
  299.     }  
  300.   
  301.     public void setDEFAULT_VALUE_LABEL_COLOR(Color default_value_label_color) {  
  302.         DEFAULT_VALUE_LABEL_COLOR = default_value_label_color;  
  303.     }  
  304. }  
 

注:
转自:http://blog.csdn.net/soconglin/article/details/6759114
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值