- public class FinancePlot extends Plot implements Cloneable, Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- /** The default grid line stroke. */
- public static final Stroke DEFAULT_GRIDLINE_STROKE = new BasicStroke(0.5f,
- BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0.0f, new float[]
- {2.0f, 2.0f}, 0.0f);
- /** The default grid line paint. */
- private Color DEFAULT_GRIDLINE_PAINT = Color.lightGray;
- private Color DEFAULT_GREENLINE_PAINT = new Color(213,249,254);
- /** The default value label font. */
- private Font DEFAULT_VALUE_LABEL_FONT = new Font("SansSerif", Font.PLAIN, 18);
- private Color DEFAULT_VALUE_LABEL_COLOR = Color.BLACK;
- /** The default font for titles. */
- public static final Font DEFAULT_TITLE_FONT = new Font("SansSerif", Font.BOLD, 18);
- public static final int DEFAULT_MARGIN = 5;
- /**每根柱子的高度*/
- private static final int DEFAULT_BAR_HEIGHT = 20;
- /**每根柱子的宽度*/
- private static final int DEFAULT_BAR_WIDTH = 320;
- /**标签宽度*/
- private static final int DEFAULT_LABEL_WIDTH = 100;
- /**标签高度*/
- private static final int DEFAULT_LABEL_HEIGHT = 70;
- /**图型数据集合*/
- private List<Finance> dataset;
- /**地区*/
- private String district_name;
- /**柱子标签标题*/
- private String labelTitle = null;
- /**被除数标题*/
- private String dividendTitle = null;
- /**除数标题*/
- private String divisorTitle = null;
- /**
- * 财务报表图
- * @param dataset 当前财务数据
- * @param title1 柱子标签标题
- * @param title2 被除数标题
- * @param title3 除数标题
- */
- public FinancePlot(List<Finance> dataset,String title1,String title2,String title3){
- setDataset(dataset);
- setDistrict_name(district_name);
- setLabelTitle(title1);
- setDividendTitle(title2);
- setDivisorTitle(title3);
- }
- public void draw(Graphics2D g2, Rectangle2D area,
- Point2D anchor,
- PlotState parentState,
- PlotRenderingInfo state) {
- // don't let anyone draw outside the data area
- Shape savedClip = g2.getClip();
- g2.setStroke(new BasicStroke(1.0f));
- g2.clip(area);
- g2.setFont(DEFAULT_VALUE_LABEL_FONT);
- //画白色背景
- g2.fillRect((int)area.getX(), (int)area.getY(), (int)area.getWidth(), (int)area.getHeight());
- //画图例
- int x = getDEFAULT_MARGIN();
- int y = getDEFAULT_MARGIN();
- if(getLegendColor()!=null){
- createLegend(g2);
- x = getDEFAULT_MARGIN();
- y = 45;
- }
- //画三个标题{指标,指标排名,企业总数}
- g2.setColor(DEFAULT_VALUE_LABEL_COLOR);
- if(getLabelTitle()!=null){
- g2.drawString(getLabelTitle(), x, y);
- }
- if(getDividendTitle()!=null){
- x = 100+(340-calcStringWidth(g2,DEFAULT_VALUE_LABEL_FONT,getDividendTitle()))/2;
- g2.drawString(getDividendTitle(), x, y);
- }
- if(getDivisorTitle()!=null){
- x = 520+((50-calcStringWidth(g2,DEFAULT_VALUE_LABEL_FONT,getDivisorTitle()))/2);
- g2.drawString(getDivisorTitle(), x, y);
- }
- //画指标排名矩形框
- x = 70;
- y = y + 30;
- // g2.setColor(DEFAULT_GREENLINE_PAINT);
- // g2.drawString("", x, 620);
- //画指企业总数矩形框
- x = 625;
- // g2.setColor(DEFAULT_GREENLINE_PAINT);
- // g2.drawString("", x, 85);
- //画后四项的标尺刻度
- for(int i = 1; i < dataset.size(); i++){
- g2.setColor(DEFAULT_VALUE_LABEL_COLOR);
- //画标尺的横线
- g2.drawLine(70, (y+95*i)+10, 400, (y+95*i)+10);
- //画标尺的刻度线,小竖线高度5
- g2.drawLine(70, (y+95*i)+10, 70, (y+95*i)+5);
- g2.drawString("100%", 70, (y+95*i));
- for(int n = 2; n <= 4; n++){
- g2.setColor(DEFAULT_VALUE_LABEL_COLOR);
- g2.drawString((100-25*(n-1))+"%", 95+80*(n-1), (y+95*i));
- g2.drawLine(95+80*(n-1), (y+95*i)+10, 95+80*(n-1), (y+95*i)+5);
- }
- g2.setColor(DEFAULT_VALUE_LABEL_COLOR);
- g2.drawString("0%", 400, (y+95*i));
- g2.drawLine(400, (y+95*i)+10, 400, (y+95*i)+5);
- }
- //画柱子标签、柱子及柱子值
- Map<String,Color> legendColor = getLegendColor();
- x = 70;
- g2.setStroke(new BasicStroke(1));
- for(int i = 0;i < dataset.size(); i++){
- Finance finance = dataset.get(i);
- int j =0;
- //循环得到一个小柱形图
- for(String key : legendColor.keySet()){
- //标签
- g2.setColor(DEFAULT_VALUE_LABEL_COLOR);
- TextUtils.drawMultiLineText(finance.getLabel(), g2, this.DEFAULT_VALUE_LABEL_FONT, 65, new Point2D.Double(getDEFAULT_MARGIN(), (y+95*i)+25));
- //计算柱形长度
- int w = 360;
- if(finance.getDivsior(key)!=null && finance.getDivsior(key).intValue()!=0 && finance.getDividend(key)!=null){
- w = new BigDecimal(1).subtract(finance.getDividend(key).divide(finance.getDivsior(key),2, RoundingMode.HALF_UP)).multiply(new BigDecimal(320)).intValue();
- }
- //画柱子
- g2.setColor(Color.WHITE);
- g2.drawRect(x, (y+95*i)+20*j+15, w, getDEFAULT_BAR_HEIGHT());
- //将矩形填充为颜色
- g2.setColor(finance.getLegend_color().get(key));
- g2.fillRect(x, (y+95*i)+20*j+15, w, getDEFAULT_BAR_HEIGHT());
- //画间隔
- g2.setColor(Color.WHITE);
- g2.drawRect(x, (y+95*i)+20*j+15, w, 2);
- //将矩形填充为颜色
- g2.setColor(Color.WHITE);
- g2.fillRect(x, (y+95*i)+20*j+15, w, 2);
- // //画柱子值
- g2.setColor(DEFAULT_VALUE_LABEL_COLOR);
- if(finance.getDividend(key)!=null){
- g2.drawString(finance.getDividend(key).intValue()+"", x+w+2, (y+95*i)+20*(j+1)+10);
- }
- //画柱子除数值
- if(finance.getDivsior(key)!=null){
- g2.drawString(finance.getDivsior(key).intValue()+"", 530, (y+95*i)+20*(j+1)+10);
- }
- j++;
- }
- }
- //画最上面的刻度尺
- g2.drawLine(70, y+10, 400, y+10);
- g2.setColor(DEFAULT_VALUE_LABEL_COLOR);
- g2.drawLine(x, y+10, x, y+5);
- g2.drawString("100%", x, y-5);
- for(int i = 2; i <= 4; i++){
- g2.setColor(DEFAULT_VALUE_LABEL_COLOR);
- g2.drawString((100-25*(i-1))+"%", 70+80*(i-1), y-5);
- g2.drawLine(70+80*(i-1), y+10, 70+80*(i-1), y+5);
- }
- g2.setColor(DEFAULT_VALUE_LABEL_COLOR);
- g2.drawLine(400, y+10, 400, y+5);
- g2.drawString("0%", 400, y-5);
- g2.setClip(savedClip);
- }
- private void createLegend(Graphics2D g2){
- int x = getDEFAULT_MARGIN();
- int y = getDEFAULT_MARGIN();
- Map<String,Color> legendColor = getLegendColor();
- for(String key : legendColor.keySet()){
- //画一个矩形
- g2.setColor(legendColor.get(key));
- g2.drawRect(x, y, 20, 10);
- //将矩形填充颜色
- g2.fillRect(x, y, 20, 10);
- x = x + 20;
- //画图例标签
- g2.setColor(DEFAULT_VALUE_LABEL_COLOR);
- g2.drawString(key, x+10, y+10);
- //计算图例标签的宽度+图例间隔30
- x = x + calcStringWidth(g2,DEFAULT_VALUE_LABEL_FONT,key) + 30;
- }
- }
- private int calcStringWidth(Graphics2D g2,Font ft,String title){
- FontMetrics fm = g2.getFontMetrics(ft);
- Rectangle2D textBound = TextUtilities.getTextBounds(title,g2,fm);
- return (int)textBound.getWidth();
- }
- @Override
- public String getPlotType() {
- return "Finace Plot";
- }
- public static int getDEFAULT_BAR_HEIGHT() {
- return DEFAULT_BAR_HEIGHT;
- }
- public static int getDEFAULT_BAR_WIDTH() {
- return DEFAULT_BAR_WIDTH;
- }
- public static Stroke getDEFAULT_GRIDLINE_STROKE() {
- return DEFAULT_GRIDLINE_STROKE;
- }
- public static int getDEFAULT_LABEL_HEIGHT() {
- return DEFAULT_LABEL_HEIGHT;
- }
- public static int getDEFAULT_LABEL_WIDTH() {
- return DEFAULT_LABEL_WIDTH;
- }
- public static int getDEFAULT_MARGIN() {
- return DEFAULT_MARGIN;
- }
- public static Font getDEFAULT_TITLE_FONT() {
- return DEFAULT_TITLE_FONT;
- }
- public void setDataset(List<Finance> dataset) {
- this.dataset = dataset;
- }
- public void setDistrict_name(String district_name) {
- this.district_name = district_name;
- }
- public void setDividendTitle(String dividendTitle) {
- this.dividendTitle = dividendTitle;
- }
- public void setDivisorTitle(String divisorTitle) {
- this.divisorTitle = divisorTitle;
- }
- public void setLabelTitle(String labelTitle) {
- this.labelTitle = labelTitle;
- }
- public String getDividendTitle() {
- return dividendTitle;
- }
- public String getDivisorTitle() {
- return divisorTitle;
- }
- public String getLabelTitle() {
- return labelTitle;
- }
- private Map<String,Color> getLegendColor(){
- Map<String,Color> legendColor = null;
- if(dataset!=null){
- legendColor = new LinkedHashMap<String,Color>();
- for(int i=0; i<dataset.size(); i++){
- Finance finance = dataset.get(i);
- if(finance==null || finance.getLegend_color()==null) continue;
- legendColor.putAll(finance.getLegend_color());
- }
- }
- return legendColor;
- }
- public void setDEFAULT_GRIDLINE_PAINT(Color default_gridline_paint) {
- DEFAULT_GRIDLINE_PAINT = default_gridline_paint;
- }
- public void setDEFAULT_VALUE_LABEL_FONT(Font default_value_label_font) {
- DEFAULT_VALUE_LABEL_FONT = default_value_label_font;
- }
- public void setDEFAULT_VALUE_LABEL_COLOR(Color default_value_label_color) {
- DEFAULT_VALUE_LABEL_COLOR = default_value_label_color;
- }
- }
![](http://hi.csdn.net/attachment/201109/8/0_1315448259mzjn.gif)
注:
转自:http://blog.csdn.net/soconglin/article/details/6759114