jfreechat 例子

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;">public class MySpiderWebPlot extends SpiderWebPlot {  
  2.     /**
  3.      *
  4.      */ 
  5.     private static final long serialVersionUID = 4005814203754627127L; 
  6.     private int ticks = DEFAULT_TICKS;  
  7.     private static final int DEFAULT_TICKS = 5;  
  8.     private NumberFormat format = NumberFormat.getInstance();  
  9.     private static final double PERPENDICULAR = 90;  
  10.     private static final double TICK_SCALE = 0.015;  
  11.     private int valueLabelGap = DEFAULT_GAP;  
  12.     private static final int DEFAULT_GAP = 10;  
  13.     private static final 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, final double 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 static void 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 static void 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> 
public class MySpiderWebPlot extends SpiderWebPlot { 
    /**
	 * 
	 */
	private static final long serialVersionUID = 4005814203754627127L;
	private int ticks = DEFAULT_TICKS; 
    private static final int DEFAULT_TICKS = 5; 
    private NumberFormat format = NumberFormat.getInstance(); 
    private static final double PERPENDICULAR = 90; 
    private static final double TICK_SCALE = 0.015; 
    private int valueLabelGap = DEFAULT_GAP; 
    private static final int DEFAULT_GAP = 10; 
    private static final double THRESHOLD = 15; 
   
    
  
    MySpiderWebPlot(CategoryDataset createCategoryDataset) { 
            super(createCategoryDataset); 
    } 
    @Override 
    protected void drawLabel(final Graphics2D g2, final Rectangle2D plotArea, final double value, 
                    final int cat, final double startAngle, final double extent) { 
            super.drawLabel(g2, plotArea, value, cat, startAngle, extent); 
            final FontRenderContext frc = g2.getFontRenderContext(); 
            final double[] transformed = new double[2]; 
            final double[] transformer = new double[2]; 
            final Arc2D arc1 = new Arc2D.Double(plotArea, startAngle, 0, Arc2D.OPEN); 
            for (int i = 1; i <= ticks; i++) { 
                    final Point2D point1 = arc1.getEndPoint(); 
                    final double deltaX = plotArea.getCenterX(); 
                    final double deltaY = plotArea.getCenterY(); 
                    double labelX = point1.getX() - deltaX; 
                    double labelY = point1.getY() - deltaY; 
                    final double scale = ((double) i / (double) ticks); 
                    final AffineTransform tx = AffineTransform.getScaleInstance(scale, scale); 
                    final AffineTransform pointTrans = AffineTransform.getScaleInstance(scale + TICK_SCALE, scale + TICK_SCALE); 
                    transformer[0] = labelX; 
                    transformer[1] = labelY; 
                    pointTrans.transform(transformer, 0, transformed, 0, 1); 
                    final double pointX = transformed[0] + deltaX; 
                    final double pointY = transformed[1] + deltaY; 
                    tx.transform(transformer, 0, transformed, 0, 1); 
                    labelX = transformed[0] + deltaX; 
                    labelY = transformed[1] + deltaY; 
                    double rotated = (PERPENDICULAR); 
                    AffineTransform rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY); 
                    transformer[0] = pointX; 
                    transformer[1] = pointY; 
                    rotateTrans.transform(transformer, 0, transformed, 0, 1); 
                    final double x1 = transformed[0]; 
                    final double y1 = transformed[1]; 
                    rotated = (-PERPENDICULAR); 
                    rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY); 
                    rotateTrans.transform(transformer, 0, transformed, 0, 1); 
                    final Composite saveComposite = g2.getComposite(); 
                    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f)); 
                    g2.draw(new Line2D.Double(transformed[0], transformed[1], x1, y1)); 
                    if (startAngle == this.getStartAngle()) { 
                            final String label = format.format(((double) i / (double) ticks) * this.getMaxValue()); 
                            final LineMetrics lm = getLabelFont().getLineMetrics(label, frc); 
                            final double ascent = lm.getAscent(); 
                            if (Math.abs(labelX - plotArea.getCenterX()) < THRESHOLD) { 
                                    labelX += valueLabelGap; 
                                    labelY += ascent / (float) 2; 
                            } else if (Math.abs(labelY - plotArea.getCenterY()) < THRESHOLD) { 
                                    labelY += valueLabelGap; 
                            } else if (labelX >= plotArea.getCenterX()) { 
                                    if (labelY < plotArea.getCenterY()) { 
                                            labelX += valueLabelGap; 
                                            labelY += valueLabelGap; 
                                    } else { 
                                            labelX -= valueLabelGap; 
                                            labelY += valueLabelGap; 
                                    } 
                            } else { 
                                    if (labelY > plotArea.getCenterY()) { 
                                            labelX -= valueLabelGap; 
                                            labelY -= valueLabelGap; 
                                    } else { 
                                            labelX += valueLabelGap; 
                                            labelY -= valueLabelGap; 
                                    } 
                            } 
                            g2.setPaint(getLabelPaint()); 
                            g2.setFont(getLabelFont()); 
                            g2.drawString(label, (float) labelX, (float) labelY); 
                    } 
                    g2.setComposite(saveComposite); 
            } 
    } 
}


public class MySpriderWebPlotTest {
    public static void main(String args[]) {
     //在SWING中显示
        JFrame jf = new JFrame();
        jf.add(erstelleSpinnenDiagramm());
        jf.pack();
        jf.setVisible(true);
        //将JFreeChart保存为图片存在文件路径中
        saveAsFile("E:/JfreeChart/MySpiderWebPlot.png",500,400);
    }
    public static JPanel erstelleSpinnenDiagramm() {
        JFreeChart jfreechart =createChart();
        ChartPanel chartpanel = new ChartPanel(jfreechart);
        return chartpanel;
    }
    
    
    public static void saveAsFile(String outputPath,
   int weight, int height) {
  FileOutputStream out = null;
  try {
   File outFile = new File(outputPath);
   if (!outFile.getParentFile().exists()) {
    outFile.getParentFile().mkdirs();
   }
   out = new FileOutputStream(outputPath);

   // 保存为PNG
   ChartUtilities.writeChartAsPNG(out, createChart(),weight, height);
   // 保存为JPEG
   // ChartUtilities.writeChartAsJPEG(out, chart, 500, 400);
   out.flush();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (out != null) {
    try {
     out.close();
    } catch (IOException e) {
     // do nothing
    }
   }
  }
 }
 public static JFreeChart createChart() {
     MySpiderWebPlot spiderwebplot = new MySpiderWebPlot(createDataset());
         JFreeChart jfreechart = new JFreeChart("前三个季度水果销售报告", TextTitle.DEFAULT_FONT,spiderwebplot, false);
         LegendTitle legendtitle = new LegendTitle(spiderwebplot);
         legendtitle.setPosition(RectangleEdge.BOTTOM);
         jfreechart.addSubtitle(legendtitle);
         return jfreechart;
 }
 public static DefaultCategoryDataset createDataset() {
   DefaultCategoryDataset dataset = new DefaultCategoryDataset();
         String group1 = "苹果 ";
         
         dataset.addValue(5, group1, "一月份");
         dataset.addValue(6, group1, "二月份");
         dataset.addValue(4, group1, "三月份");
         dataset.addValue(2, group1, "四月份");
         dataset.addValue(5, group1, "五月份");
         dataset.addValue(5, group1, "六月份");
         dataset.addValue(5, group1, "七月份");
         dataset.addValue(8, group1, "八月份");
         
         String group2 = "橙子";
         dataset.addValue(3, group2, "一月份");
         dataset.addValue(3, group2, "二月份");
         dataset.addValue(4, group2, "三月份");
         dataset.addValue(7, group2, "四月份");
         dataset.addValue(4, group2, "五月份");
         dataset.addValue(5, group2, "六月份");
         dataset.addValue(3, group2, "七月份");
         dataset.addValue(3, group2, "八月份");
         
         String group3 = "香蕉";
         dataset.addValue(4, group3, "一月份");
         dataset.addValue(5, group3, "二月份");
         dataset.addValue(2, group3, "三月份");
         dataset.addValue(5, group3, "四月份");
         dataset.addValue(6, group3, "五月份");
         dataset.addValue(6, group3, "六月份");
         dataset.addValue(4, group3, "七月份");
         dataset.addValue(4, group3, "八月份");
         return dataset;
 }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值