rt/download.html

2 所需jar包:

  1. 解压jfreechart-1.0.14.zip,并打开lib文件夹;
  2. 将jfreechart-1.0.14.jar、jcommon-1.0.17.jar导入自己的工程当中;

三、配置使用:

下面介绍生成柱状图、饼图、折线图的简单生成方式及生成的图的展现方式,如:图片文件、jsp页面。

1 柱状图:


下边的方法为生成柱状图的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
 * 创建柱状图
 * @param chartTitle 图表标题
 * @param xName      x轴标题
 * @param yName      y轴标题
 * @param dataset    数据集
 * @return
 */
public static JFreeChart createChart(String chartTitle, String xName,
        String yName, CategoryDataset dataset) {
    /**
     * createBarChart的参数分别为:
     * 标题,横坐标标题,纵坐标标题,数据集,图标方向(水平、垂直)
     * ,是否显示图例,是否显示tooltips,是否urls
     */
    JFreeChart chart = ChartFactory.createBarChart(
            chartTitle, xName, yName,
            dataset, PlotOrientation.VERTICAL,
            true,true, false);
    /**
     * VALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭,
     * 使用的关闭抗锯齿后,字体尽量选择12到14号的宋体字,这样文字最清晰好看
     */
    chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
            RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
    // 背景色
    chart.setBackgroundPaint(Color.white);
    // 设置标题字体
    chart.getTitle().setFont(newFont("宋体", Font.BOLD,14));
    // 图例背景色
    chart.getLegend().setBackgroundPaint(newColor(110,182, 229));
    // 图例字体
    chart.getLegend().setItemFont(newFont("宋体", Font.PLAIN,12));
    CategoryPlot categoryPlot = (CategoryPlot) chart.getPlot();
    // 设置纵虚线可见
    //categoryPlot.setDomainGridlinesVisible(true);
    // 虚线色彩
    //categoryPlot.setDomainGridlinePaint(Color.black);
    // 设置横虚线可见
    categoryPlot.setRangeGridlinesVisible(true);
    // 虚线色彩
    categoryPlot.setRangeGridlinePaint(Color.black);
    // 设置柱的透明度
    categoryPlot.setForegroundAlpha(1.0f);
    //设置柱图背景色(注意,系统取色的时候要使用
    //16位的模式来查看颜色编码,这样比较准确)
    categoryPlot.setBackgroundPaint(newColor(110,182, 229));
    /*
     * categoryPlot.setRangeCrosshairVisible(true);
     * categoryPlot.setRangeCrosshairPaint(Color.blue);
     */
    // 纵坐标--范围轴
    NumberAxis numberAxis = (NumberAxis) categoryPlot.getRangeAxis();
    // 纵坐标y轴坐标字体
    numberAxis.setTickLabelFont(newFont("sans-serif", Font.PLAIN,12));
    // 纵坐标y轴标题字体
    numberAxis.setLabelFont(newFont("宋体", Font.PLAIN,12));
    // 设置最高的一个 Item 与图片顶端的距离
    // numberAxis.setUpperMargin(0.5);
    // 设置最低的一个 Item 与图片底端的距离
    // numberAxis.setLowerMargin(0.5);
    // 设置刻度单位 为Integer
    numberAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    // 横坐标--类别轴、域
    CategoryAxis categoryAxis = categoryPlot.getDomainAxis();
    // 横坐标x轴坐标字体
    categoryAxis.setTickLabelFont(newFont("sans-serif", Font.PLAIN,12));
    // 横坐标x轴标题字体
    categoryAxis.setLabelFont(newFont("宋体", Font.PLAIN,12));
    // 类别轴的位置,倾斜度
    categoryAxis.setCategoryLabelPositions(
            CategoryLabelPositions.createUpRotationLabelPositions(
                    0.5235987755982988D));
    //横轴上的 Lable
    //categoryAxis.setMaximumCategoryLabelWidthRatio(0.6f);
    //是否完整显示
    //设置距离图片左端距离
    categoryAxis.setLowerMargin(0.1D);
    // 设置距离图片右端距离
    categoryAxis.setUpperMargin(0.1D);
    // 渲染 - 中间的部分
    BarRenderer barRenderer = (BarRenderer) categoryPlot.getRenderer();
    // 设置柱子宽度
    barRenderer.setMaximumBarWidth(0.05);
    // 设置柱子高度
    barRenderer.setMinimumBarLength(0.2);
    // 设置柱子边框颜色
    barRenderer.setBaseOutlinePaint(Color.BLACK);
    // 设置柱子边框可见
    barRenderer.setDrawBarOutline(true);
    // 设置柱的颜色
    barRenderer.setSeriesPaint(0,new Color(0,255, 0));
    barRenderer.setSeriesPaint(1,new Color(0,0, 255));
    barRenderer.setSeriesPaint(2,new Color(255,0, 0));
    // 设置每个柱之间距离
    barRenderer.setItemMargin(0.2D);
    // 显示每个柱的数值,并修改该数值的字体属性
    barRenderer.setIncludeBaseInRange(true);
    barRenderer.setBaseItemLabelGenerator(
            newStandardCategoryItemLabelGenerator());
    barRenderer.setBaseItemLabelsVisible(true);
    returnchart;
}

柱状图的数据集:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
 * 柱状图数据集
 *
 * @return
 */
public static CategoryDataset createDataset() {
    String str1 ="Java EE开发";
    String str2 ="IOS开发";
    String str3 ="Android开发";
    String str4 ="1月";
    String str5 ="2月";
    String str6 ="3月";
    String str7 ="4月";
    String str8 ="5月";
    DefaultCategoryDataset dataset =new DefaultCategoryDataset();
    dataset.addValue(1.0D, str1, str4);
    dataset.addValue(4.0D, str1, str5);
    dataset.addValue(3.0D, str1, str6);
    dataset.addValue(5.0D, str1, str7);
    dataset.addValue(5.0D, str1, str8);
    dataset.addValue(5.0D, str2, str4);
    dataset.addValue(7.0D, str2, str5);
    dataset.addValue(6.0D, str2, str6);
    dataset.addValue(8.0D, str2, str7);
    dataset.addValue(4.0D, str2, str8);
    dataset.addValue(4.0D, str3, str4);
    dataset.addValue(3.0D, str3, str5);
    dataset.addValue(2.0D, str3, str6);
    dataset.addValue(3.0D, str3, str7);
    dataset.addValue(6.0D, str3, str8);
    returndataset;
}

2 饼图:


下边为饼图的生成方法和数据的生成方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/**
 * 生成饼图
 * @param chartTitle 图的标题
 * @param dataset 数据集
 * @param pieKeys 分饼的名字集
 * @return
 */
public static JFreeChart createPieChart3D(
        String chartTitle,
        PieDataset dataset,
        String[] pieKeys) {
    JFreeChart chart = ChartFactory.createPieChart3D(
            chartTitle,
            dataset,
            true,//显示图例
            true,
            false);
    //关闭抗锯齿,是字体清晰
    chart.getRenderingHints().put(
            RenderingHints.KEY_TEXT_ANTIALIASING,
            RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
    chart.setTextAntiAlias(false);
    //图片背景色
    chart.setBackgroundPaint(Color.white);
    //设置图标题的字体重新设置title
    Font font =new Font("隶书", Font.BOLD,25);
    chart.getTitle().setFont(font);
    /*TextTitle title = new TextTitle(chartTitle);
    title.setFont(font);
    chart.setTitle(title);*/
    //设置图例字体
    chart.getLegend().setItemFont(newFont("宋体",Font.PLAIN,14));
    PiePlot3D plot = (PiePlot3D) chart.getPlot();
    // 图片中显示百分比:默认方式
    // 指定饼图轮廓线的颜色
    // plot.setBaseSectionOutlinePaint(Color.BLACK);
    // plot.setBaseSectionPaint(Color.BLACK);
    // 设置无数据时的信息
    plot.setNoDataMessage("无对应的数据,请重新查询。");
    // 设置无数据时的信息显示颜色
    plot.setNoDataMessagePaint(Color.red);
    // 图片中显示百分比:自定义方式,{0} 表示选项,
    //{1} 表示数值, {2} 表示所占比例 ,小数点后两位
    plot.setLabelGenerator(newStandardPieSectionLabelGenerator(
            "{0}={1}({2})", NumberFormat.getNumberInstance(),
            newDecimalFormat("0.00%")));
    //图片显示字体
    plot.setLabelFont(newFont("宋体", Font.TRUETYPE_FONT,12));
    // 图例显示百分比:自定义方式, {0} 表示选项,
    //{1} 表示数值, {2} 表示所占比例
    plot.setLegendLabelGenerator(newStandardPieSectionLabelGenerator(
            "{0}={1}({2})"));
    // 指定图片的透明度(0.0-1.0)
    plot.setForegroundAlpha(0.65f);
    // 指定显示的饼图上圆形(false)还椭圆形(true)
    plot.setCircular(false,true);
    // 设置第一个 饼块section 的开始位置,默认是12点钟方向
    plot.setStartAngle(90);
    // // 设置分饼颜色
    plot.setSectionPaint(pieKeys[0],new Color(244,194, 144));
    plot.setSectionPaint(pieKeys[1],new Color(144,233, 144));
    returnchart;
}
// 饼状图 数据集
public static PieDataset getDataPieSetByUtil(double[] data,
        String[] datadescription) {
    if(data != null && datadescription != null) {
        if(data.length == datadescription.length) {
            DefaultPieDataset dataset =new DefaultPieDataset();
            for(int i = 0; i < data.length; i++) {
                dataset.setValue(datadescription[i], data[i]);
            }
            returndataset;
        }
    }
    returnnull;
}

3 折线图:


下边为折线图的生成方法,其中,数据集的生成方式和柱状图类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/**
 * 生成折线图
 * @param chartTitle 图的标题
 * @param x          横轴标题
 * @param y          纵轴标题
 * @param dataset    数据集
 * @return
 */
public static JFreeChart createLineChart(
        String chartTitle, String x,
        String y, CategoryDataset dataset) {
    // 构建一个chart
    JFreeChart chart = ChartFactory.createLineChart(
            chartTitle,
            x,
            y,
            dataset,
            PlotOrientation.VERTICAL,
            true,
            true,
            false);
    //字体清晰
    chart.setTextAntiAlias(false);
    // 设置背景颜色
    chart.setBackgroundPaint(Color.WHITE);
    // 设置图标题的字体
    Font font =new Font("隶书", Font.BOLD,25);
    chart.getTitle().setFont(font);
    // 设置面板字体
    Font labelFont =new Font("SansSerif", Font.TRUETYPE_FONT,12);
    // 设置图示的字体
    chart.getLegend().setItemFont(labelFont);
    CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
    // x轴 // 分类轴网格是否可见
    categoryplot.setDomainGridlinesVisible(true);
    // y轴 //数据轴网格是否可见
    categoryplot.setRangeGridlinesVisible(true);
    categoryplot.setRangeGridlinePaint(Color.WHITE);// 虚线色彩
    categoryplot.setDomainGridlinePaint(Color.WHITE);// 虚线色彩
    categoryplot.setBackgroundPaint(Color.lightGray);// 折线图的背景颜色
    // 设置轴和面板之间的距离
    // categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
    // 横轴 x
    CategoryAxis domainAxis = categoryplot.getDomainAxis();
    domainAxis.setLabelFont(labelFont);// 轴标题
    domainAxis.setTickLabelFont(labelFont);// 轴数值
    // domainAxis.setLabelPaint(Color.BLUE);//轴标题的颜色
    // domainAxis.setTickLabelPaint(Color.BLUE);//轴数值的颜色
    // 横轴 lable 的位置 横轴上的 Lable 45度倾斜 DOWN_45
    domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD);
    // 设置距离图片左端距离
    domainAxis.setLowerMargin(0.0);
    // 设置距离图片右端距离
    domainAxis.setUpperMargin(0.0);
    // 纵轴 y
    NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
    numberaxis.setLabelFont(labelFont);
    numberaxis.setTickLabelFont(labelFont);
    numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    numberaxis.setAutoRangeIncludesZero(true);
    // 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
    LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot
            .getRenderer();
    lineandshaperenderer.setBaseShapesVisible(true);// series 点(即数据点)可见
    lineandshaperenderer.setBaseLinesVisible(true);// series 点(即数据点)间有连线可见
    // 显示折点数据
    lineandshaperenderer
            .setBaseItemLabelGenerator(newStandardCategoryItemLabelGenerator());
    lineandshaperenderer.setBaseItemLabelsVisible(true);
    returnchart;
}

4 图表的显示方式:

我总结了三种使用情况,分别为:
①生成图片到指定目录的方式;
②在servlet中使用,并在jsp页面中显示图片;
③在struts2中使用,并在jsp页面中显示图片;

第一种

第一种为生成指定的图片到指定的目录
需要用到ChartUtilities类的writeChartAsPNG方法,具体使用方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FileOutputStream fosChart =null;
try {
    //文件夹不存在则创建
    File file =new File(CHART_PATH);
    if(!file.exists()) {
        file.mkdirs();
    }
    String chartName = CHART_PATH + charName;
    fosChart =new FileOutputStream(chartName);
    //高宽的设置影响椭圆饼图的形状
    ChartUtilities.writeChartAsPNG(fosChart, chart,500, 230);
    returnchartName;
} catch(Exception e) {
    e.printStackTrace();
} finally{
    try{
        fosChart.close();
    }catch (Exception e) {
        e.printStackTrace();
    }
}

其中,CHART_PATH为文件路径,charName为生成图的名称

第二种

第二种为在servlet中使用,需要配置servlet,生成的图片会自动存放至tomcat服务器的temp临时文件夹下,具体如下:
首先配置访问图片的servlet的请求:

1
2
3
4
5
6
7
8
9
<!-- 配置jfreechart 的servlet,用来访问图片的请求 web.xml-->
<servlet>
    <servlet-name>DisplayChart</servlet-name>
    <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DisplayChart</servlet-name>
    <url-pattern>/DisplayChart</url-pattern>
</servlet-mapping>

然后在servlet中,使用ServletUtilities.saveChartAsPNG方法生成临时文件,并返回文件名称,客户端就可以根据url去访问临时图片了。

1
2
3
4
5
6
7
8
9
10
11
12
//ServletUtilities是面向web开发的工具类,返回一个字符串文件名,
//文件名自动生成,生成好的图片会自动放在服务器的临时文件下(temp)
String filename = ServletUtilities.saveChartAsPNG(
        chart,800, 400,null, request.getSession());
//根据文件名去临时目录下寻找该图片,
//这里的/DisplayChart路径要与配置文件里用户自定义的一致
String graphURL = request.getContextPath() +
        "/DisplayChart?filename="+ filename;
request.setAttribute("imgurl", graphURL);
request.getRequestDispatcher("index.jsp").forward(request, response);

第三种

第三种是在struts2中使用jfreechart,需要添加在struts2中添加jfreechart支持,即添加struts2-jfreechart-plugin-2.3.1.2.jar
然后配置struts.xml配置文件添加:

1
2
3
800400
<!-- 对应上边引用的result type chart -->

最后,需要在Action的某方法中,给JFreeChart对象赋值,并实现get方法,即可通过页面访问该action得到图片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private JFreeChart chart;
public String barchart() {
    try{
        chart = chequeService.getBarchart();
    }catch (Exception e) {
        e.printStackTrace();
    }
    returnSUCCESS;
}
public JFreeChart getChart() {
    returnchart;
}
public void setChart(JFreeChart chart) {
    this.chart = chart;
}

源码地址:https://github.com/huozhicheng/JFreeChart

JFreeChart 简单使用相关推荐

  1. JFreeChart简单介绍及用法(入门)

    (学习留存,如有侵权,请告知,立刻删除!) 1.jfreechart简单介绍以及jar包下载 首先了解JFreeChart是什么,它是JAVA平台上的一个开源报表系统(开放的图表绘制类库),通过它可以 ...

  2. java曲线平滑算法_JFreeChart简单实现光滑曲线绘制

    用JFreeChart绘制光滑曲线,利用最小二乘法数学原理计算,供大家参考,具体内容如下 绘制图形: 代码: FittingCurve.java package org.jevy; import ja ...

  3. 利用JFreeChart生成简单柱状图(Java)

    1 package barchartdemo1; 2 3 import <a href="http://lib.csdn.net/base/javaee" class='re ...

  4. JFreeChart的简单图表的制作------柱形图

    最近由于网站项目中要用到报表,之前没有学过,所以今天特地稍微的学习了一下,我用JFreeChart来实现的,JFreeChart网上的资源不是那么的多,因为它的jar包免费提供但是文档确实收费的,下面 ...

  5. 使用jfreechart来创建一个简单的柱状图

    使用jfreechart来创建一个简单的柱状图 代码如下 package com.jfreechart;import java.io.*; import org.jfree.data.category ...

  6. 使用jfreechart来创建一个简单的饼图

    使用jfreechart来创建一个简单的饼图 代码如下 package com.jfreechart;import java.io.*; import org.jfree.data.general.D ...

  7. JFreeChart的简单应用及乱码解决

    一.JFreeChart介绍: JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP ...

  8. 用最简单的方式整合JFreechart和Structs并修改背景色

          JFreeChart是何物?熟悉java web 编程的朋友们不会陌生,它是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applet ...

  9. 报表应用系列——图表JFreeChart: 第 4 章 折线图

    双击代码全选 1 2 3 4 5 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(100 ...

  10. Open Flash Chart组件的使用 及 与 jfreechart, FusionCharts 的比较

    http://crabdave.javaeye.com/blog/189653 Open Flash Chart组件的使用 简介 OpenFlashChart是一个开源的报表制作组件,该组件能够自动生 ...

最新文章

  1. Java线程池原理及使用
  2. 数据驱动才是零售企业转型的核心!
  3. 不认识java代码_程序员进阶:优雅的代码对于一个架构师的重要性
  4. 如何快速理解递归——看这个就可以了
  5. PowerShell(PHPStorm terminal with PowerShell)运行git log中文乱码
  6. 算法动画 - 理解函数曲线
  7. 【XML】XML语法格式提要
  8. CloudFoundry基础知识之理论篇
  9. 网易严选搜索推荐实践之:“全能选手”召回表征算法实践.pdf(附下载链接)...
  10. 锤击测试使用指数窗会引起什么问题吗?
  11. Vue : Expected the Promise rejection reason to be an Error
  12. iOS /clang:-1: linker command failed with exit code 1 (use -v to see invocation) 报错
  13. 多项式曲线,分段曲线,曲线参数化,平面曲线,插值方法的样条曲线
  14. java panel paint_java – 如何使用jpanel与paint(或重绘)
  15. 190518每日一句
  16. springmuvc如何设置jsp的input跳转_小程序有链接吗?如何获取小程序的链接?
  17. 君正X1000串口流控bug
  18. Linux NFS配置固定端口
  19. k叉树的性质_相关树及性质
  20. error lnk2005解决办法

热门文章

  1. centos7 centos6.5部KVM使用NAT联网并为虚拟机配置firewalld iptables防火墙端口转发...
  2. 几个经典的递归小程序
  3. 200行Python代码实现的2048小游戏
  4. VMware下Hadoop 2.4.1完全分布式集群平台安装与设置
  5. Android 4.1初识--7月13号
  6. 多线程编程(4) - 从 CreateThread 说起[续二]
  7. 无法显示jinglingzhoushou-2.0.4.AppImage
  8. 计算机网络-交换机配置
  9. 任务调度的合理性 (25 分)(拓扑排序)
  10. 软件工程 第六章 编码与测试