jfreechat 例子

来源:互联网 发布:网络教育有考不过的吗 编辑:程序博客网 时间:2024/05/17 03:33

JFreeChart是老牌Java开源图表工具包,也是JFreeReport的重要组成部分,在业界被广泛应用。当然,这个工具包依然有很多美中不足,确切的说,有很多具体的应用还需要我们拓展,比如蜘蛛网图(Spider Web)的刻度问题。
带刻度问题比较复杂,JFreeChart本身没有提供其功能,需要继承SpiderWebPlot,覆盖drawLabel方法。

开发中需要用到jcommon-1.0.16.jar和jfreechart-1.0.13.jar

为了方便我只提供Struts下的ACTION中需要用到的生成图表的类中的全部代码

Java代码 复制代码 收藏代码
  1. <span style="font-size: medium;">publicclass MySpiderWebPlot extends SpiderWebPlot {  
  2.     /**
  3.      *
  4.      */ 
  5.     private staticfinal long serialVersionUID = 4005814203754627127L; 
  6.     private int ticks = DEFAULT_TICKS;  
  7.     private staticfinal int DEFAULT_TICKS =5;  
  8.     private NumberFormat format = NumberFormat.getInstance();  
  9.     private staticfinal double PERPENDICULAR =90;  
  10.     private staticfinal double TICK_SCALE =0.015;  
  11.     private int valueLabelGap = DEFAULT_GAP;  
  12.     private staticfinal int DEFAULT_GAP =10;  
  13.     private staticfinal double THRESHOLD =15;  
  14.     
  15.      
  16.    
  17.     MySpiderWebPlot(CategoryDataset createCategoryDataset) {  
  18.             super(createCategoryDataset);  
  19.     }  
  20.     @Override  
  21.     protected void drawLabel(final Graphics2D g2,final Rectangle2D plotArea, finaldouble value,  
  22.                     final int cat,final double startAngle,final double extent) {  
  23.             super.drawLabel(g2, plotArea, value, cat, startAngle, extent);  
  24.             final FontRenderContext frc = g2.getFontRenderContext();  
  25.             final double[] transformed =new double[2];  
  26.             final double[] transformer =new double[2];  
  27.             final Arc2D arc1 = new Arc2D.Double(plotArea, startAngle, 0, Arc2D.OPEN);  
  28.             for (int i =1; i <= ticks; i++) {  
  29.                     final Point2D point1 = arc1.getEndPoint();  
  30.                     final double deltaX = plotArea.getCenterX();  
  31.                     final double deltaY = plotArea.getCenterY();  
  32.                     double labelX = point1.getX() - deltaX;  
  33.                     double labelY = point1.getY() - deltaY;  
  34.                     final double scale = ((double) i / (double) ticks);  
  35.                     final AffineTransform tx = AffineTransform.getScaleInstance(scale, scale);  
  36.                     final AffineTransform pointTrans = AffineTransform.getScaleInstance(scale + TICK_SCALE, scale + TICK_SCALE);  
  37.                     transformer[0] = labelX;  
  38.                     transformer[1] = labelY;  
  39.                     pointTrans.transform(transformer, 0, transformed, 0, 1);  
  40.                     final double pointX = transformed[0] + deltaX;  
  41.                     final double pointY = transformed[1] + deltaY;  
  42.                     tx.transform(transformer, 0, transformed,0, 1);  
  43.                     labelX = transformed[0] + deltaX;  
  44.                     labelY = transformed[1] + deltaY;  
  45.                     double rotated = (PERPENDICULAR);  
  46.                     AffineTransform rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY);  
  47.                     transformer[0] = pointX;  
  48.                     transformer[1] = pointY;  
  49.                     rotateTrans.transform(transformer, 0, transformed, 0, 1);  
  50.                     final double x1 = transformed[0];  
  51.                     final double y1 = transformed[1];  
  52.                     rotated = (-PERPENDICULAR);  
  53.                     rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY);  
  54.                     rotateTrans.transform(transformer, 0, transformed, 0, 1);  
  55.                     final Composite saveComposite = g2.getComposite();  
  56.                     g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,1.0f));  
  57.                     g2.draw(new Line2D.Double(transformed[0], transformed[1], x1, y1));  
  58.                     if (startAngle ==this.getStartAngle()) {  
  59.                             final String label = format.format(((double) i / (double) ticks) *this.getMaxValue());  
  60.                             final LineMetrics lm = getLabelFont().getLineMetrics(label, frc);  
  61.                             final double ascent = lm.getAscent();  
  62.                             if (Math.abs(labelX - plotArea.getCenterX()) < THRESHOLD) {  
  63.                                     labelX += valueLabelGap;  
  64.                                     labelY += ascent / (float)2;  
  65.                             } else if (Math.abs(labelY - plotArea.getCenterY()) < THRESHOLD) {  
  66.                                     labelY += valueLabelGap;  
  67.                             } else if (labelX >= plotArea.getCenterX()) {  
  68.                                     if (labelY < plotArea.getCenterY()) {  
  69.                                             labelX += valueLabelGap;  
  70.                                             labelY += valueLabelGap;  
  71.                                     } else {  
  72.                                             labelX -= valueLabelGap;  
  73.                                             labelY += valueLabelGap;  
  74.                                     }  
  75.                             } else {  
  76.                                     if (labelY > plotArea.getCenterY()) {  
  77.                                             labelX -= valueLabelGap;  
  78.                                             labelY -= valueLabelGap;  
  79.                                     } else {  
  80.                                             labelX += valueLabelGap;  
  81.                                             labelY -= valueLabelGap;  
  82.                                     }  
  83.                             }  
  84.                             g2.setPaint(getLabelPaint());  
  85.                             g2.setFont(getLabelFont());  
  86.                             g2.drawString(label, (float) labelX, (float) labelY);  
  87.                     }  
  88.                     g2.setComposite(saveComposite);  
  89.             }  
  90.     }  
  91.  
  92.  
  93. public class MySpriderWebPlotTest { 
  94.     public staticvoid main(String args[]) { 
  95.      //在SWING中显示 
  96.         JFrame jf = new JFrame(); 
  97.         jf.add(erstelleSpinnenDiagramm()); 
  98.         jf.pack(); 
  99.         jf.setVisible(true); 
  100.         //将JFreeChart保存为图片存在文件路径中 
  101.         saveAsFile("E:/JfreeChart/MySpiderWebPlot.png",500,400); 
  102.     } 
  103.     public static JPanel erstelleSpinnenDiagramm() { 
  104.         JFreeChart jfreechart =createChart(); 
  105.         ChartPanel chartpanel = new ChartPanel(jfreechart); 
  106.         return chartpanel; 
  107.     } 
  108.      
  109.      
  110.     public staticvoid saveAsFile(String outputPath, 
  111.    int weight, int height) { 
  112.   FileOutputStream out = null
  113.   try
  114.    File outFile = new File(outputPath); 
  115.    if (!outFile.getParentFile().exists()) { 
  116.     outFile.getParentFile().mkdirs(); 
  117.    } 
  118.    out = new FileOutputStream(outputPath); 
  119.  
  120.    // 保存为PNG 
  121.    ChartUtilities.writeChartAsPNG(out, createChart(),weight, height); 
  122.    // 保存为JPEG 
  123.    // ChartUtilities.writeChartAsJPEG(out, chart, 500, 400); 
  124.    out.flush(); 
  125.   } catch (FileNotFoundException e) { 
  126.    e.printStackTrace(); 
  127.   } catch (IOException e) { 
  128.    e.printStackTrace(); 
  129.   } finally
  130.    if (out != null) { 
  131.     try
  132.      out.close(); 
  133.     } catch (IOException e) { 
  134.      // do nothing 
  135.     } 
  136.    } 
  137.   } 
  138. public static JFreeChart createChart() { 
  139.      MySpiderWebPlot spiderwebplot = new MySpiderWebPlot(createDataset()); 
  140.          JFreeChart jfreechart = new JFreeChart("前三个季度水果销售报告", TextTitle.DEFAULT_FONT,spiderwebplot,false); 
  141.          LegendTitle legendtitle = new LegendTitle(spiderwebplot); 
  142.          legendtitle.setPosition(RectangleEdge.BOTTOM); 
  143.          jfreechart.addSubtitle(legendtitle); 
  144.          return jfreechart; 
  145. public static DefaultCategoryDataset createDataset() { 
  146.    DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
  147.          String group1 = "苹果 "
  148.           
  149.          dataset.addValue(5, group1, "一月份"); 
  150.          dataset.addValue(6, group1, "二月份"); 
  151.          dataset.addValue(4, group1, "三月份"); 
  152.          dataset.addValue(2, group1, "四月份"); 
  153.          dataset.addValue(5, group1, "五月份"); 
  154.          dataset.addValue(5, group1, "六月份"); 
  155.          dataset.addValue(5, group1, "七月份"); 
  156.          dataset.addValue(8, group1, "八月份"); 
  157.           
  158.          String group2 = "橙子"
  159.          dataset.addValue(3, group2, "一月份"); 
  160.          dataset.addValue(3, group2, "二月份"); 
  161.          dataset.addValue(4, group2, "三月份"); 
  162.          dataset.addValue(7, group2, "四月份"); 
  163.          dataset.addValue(4, group2, "五月份"); 
  164.          dataset.addValue(5, group2, "六月份"); 
  165.          dataset.addValue(3, group2, "七月份"); 
  166.          dataset.addValue(3, group2, "八月份"); 
  167.           
  168.          String group3 = "香蕉"
  169.          dataset.addValue(4, group3, "一月份"); 
  170.          dataset.addValue(5, group3, "二月份"); 
  171.          dataset.addValue(2, group3, "三月份"); 
  172.          dataset.addValue(5, group3, "四月份"); 
  173.          dataset.addValue(6, group3, "五月份"); 
  174.          dataset.addValue(6, group3, "六月份"); 
  175.          dataset.addValue(4, group3, "七月份"); 
  176.          dataset.addValue(4, group3, "八月份"); 
  177.          return dataset; 
  178.  
  179. </span> 

顺便说下,在开发中我常用到的生成jFreeChart的步骤有三个,首先我会先创建数据集合DataSet,然后通过数据集合我会创建jFreeChart对象,最后我会通过jFreeChart提供的ChartUtilities类的writeChartAsPNG()方法将创建为图片保存到磁盘文件中,如果保存到与项目相对路径的话在WEB页面就可以呈现出我们生成的jFreeChart图片了!