1.1 什么是jfreechart
JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。

1.2 Jfreechart下载
官方网站:http://www.jfree.org/jfreechart/ ,最新版本1.0.19。
下载地址:http://sourceforge.net/projects/jfreechart/files/

下载 jfreechart-1.0.19.zip ,

java mpp 甘特图 java生成甘特图_jfreechart

柱图:

java mpp 甘特图 java生成甘特图_饼图_02

本系统柱状图的应用:

按区域统计采购金额的总量。

java mpp 甘特图 java生成甘特图_柱状图_03

折线图:

进行走势统计分析。

java mpp 甘特图 java生成甘特图_柱状图_04

药品采购金额走势分析:

java mpp 甘特图 java生成甘特图_java mpp 甘特图_05

饼图:
统计百分比暂用情况。

java mpp 甘特图 java生成甘特图_jfreechart_06

2 Jfreechart开发测试
2.1 将jfreechart的jar包加入工程
需要这两个jar 包
jcommon-1.0.23.jar jfreechart公用类库

jfreechart-1.0.19.jar jfreechart的图表类库
在主工程的pom.xml 中配置

<!-- jfreechart -->
        <dependency>
            <groupId>org.jfree</groupId>
            <artifactId>jcommon</artifactId>
            <version>1.0.23</version>
        </dependency>
        <dependency>
            <artifactId>jfreechart</artifactId>
            <groupId>org.jfree</groupId>
            <version>1.0.19</version>
        </dependency>

2.2 柱状图Jfreechart代码:
第一步:构造一个Dataset :填充要统计的数据

可以通过二维数据定义数据格式:

double[][] data = new double[][] {
                    { 1310, 720.68, 675.3, 560, 680.88, 780 } 
                    };

也可以通过api

dataset2.addValue(1310, "药品采购金额", "崔庙镇");

第二步:生成图形:
ChartFactory.createBarChart3D来生成柱状图

JFreeChart chart = ChartFactory.createBarChart3D(
                    "药品采购金额汇总",// 图形名称
                    "",// 分类名称,为横坐标名称
                    "采购金额(元)",// 值名称,为纵坐标名称
                    dataset,// 数据集合
                    PlotOrientation.VERTICAL,// 垂直显示
                    false,// 是否显示图例
                    false,// 是否使用工具提示
                    false);// 是否使用url

第三步:图形输出:

通过response输出;

//通过response输入图片
            response.setContentType("image/png");
            ChartUtilities.writeChartAsPNG(out, chart, 800, 500);

2.3 Jfreechart中文乱码问题

Jfreechart对中文支持不好,jfreechart生成图形默认设置的字体不是,本机中文字体。

如何解决?
人为在chart(jfreechart图形)中设置中文字体

需要设置:
图形title字体,
横坐标字体
统计分类字体
纵坐标显示字体

// 配置字体
        Font xfont = new Font("宋体", Font.PLAIN, 12);// X轴
        Font yfont = new Font("宋体", Font.PLAIN, 12);// Y轴
        Font kfont = new Font("宋体", Font.PLAIN, 12);// 底部
        Font titleFont = new Font("宋体", Font.BOLD, 25); // 图片标题
        // 图形的绘制结构对象,对于饼图不适用
        CategoryPlot plot = chart.getCategoryPlot();

        // 图片标题
        chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));

        // 底部
        LegendTitle legendTitle = chart.getLegend();
        if (legendTitle != null) {
            legendTitle.setItemFont(kfont);
        }

        // X 轴
        CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setLabelFont(xfont);// 轴标题
        domainAxis.setTickLabelFont(xfont);// 轴数值
        domainAxis.setTickLabelPaint(Color.BLUE); // 字体颜色
        // domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);

        // Y 轴
        ValueAxis rangeAxis = plot.getRangeAxis();
        rangeAxis.setLabelFont(yfont);
        rangeAxis.setLabelPaint(Color.BLUE); // 字体颜色
        rangeAxis.setTickLabelFont(yfont);

上边的代码适用柱状图,设置字体,
对于折线图、饼图设置字体 的代码不太一样,需要单独对不同类型的图形设置字体。

2.4 Dataset构造的第二种方法

DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            //第一个参数:统计数值,第二个参数:统计指标名称,第三个参数:统计分类
            dataset.addValue(1310, "药品采购金额", "崔庙镇");
            dataset.addValue(720.68, "药品采购金额", "汜水镇");
            dataset.addValue(675.3, "药品采购金额", "高山镇");
            dataset.addValue(560, "药品采购金额", "城关乡");
            dataset.addValue(680.88, "药品采购金额", "刘河镇");
            dataset.addValue(780, "药品采购金额", "环翠峪");

            //实际开发时,数据从数据库查询出来,
            //在for循环中向dataset中添加数据

2.5 输出图形的第二种方法

通过jfreechart的servlet输出图形。

2.5.1 思路:
在action代码中,生成图形后暂时存入session
得到存入session的图形名称(图形对应的key)
在页面中通过img展示生成的图形,通过jfreechart的servlet输出图形

2.5.2 实现:
配置jfreechart的servlet

第一步:在web.xml配置:

<!-- jfreechart -->
    <servlet>
        <servlet-name>jfreechart</servlet-name>
        <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>jfreechart</servlet-name>
        <url-pattern>/jfreechart</url-pattern>
    </servlet-mapping>

第二步:将图形放在session,得到filename

// 将图形放在session,得到filename
        String jfreechart_filename = ServletUtilities.saveChartAsPNG(chart,
                900, 500, null, session);

        model.addAttribute("jfreechart_filename", jfreechart_filename);

第三步:在页面通过jfreechart的servlet生成 图形

<!-- jfreechart图形freechart 为servlet 的名字filename 为action  中的key-->
                        <img src="${baseurl }/jfreechart?filename=${jfreechart_filename }"  border=0 />