准备环境:
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
eclipse 3.6
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
maven 3.0.4
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
struts 2.1.8
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
JFreeChart 1.0.9
JFreeChart 是一组功能强大、灵活易用的Java绘图API,使用它可以生成多种通用性的报表,包括柱状图、饼图、曲线图、甘特图等。目前 JFreeChart 的最新版本是 1.0.14,
最近几天不知为何,sourceforge 网站一直无法访问,JFreeChart 现在在官网下载不了了,本人已将现用版本和最新版本上传至网盘,需要的朋友可以点击链接下载:
JFreeChart-1.0.9 :http://115.com/file/e7194ucb#jfreechart-1.0.9.zip
JFreeChart-1.0.14:
http://115.com/file/an8lwzqu#jfreechart-1.0.14.zip
据说,JFreeChart 从 1.0.10 版本开始,图表的中文字体会变成乱码,我用 1.0.13 和 1.0.14 两个版本测试的时候确实是会出现中文乱码,1.0.9 这个版本不会出现这种情况,
解决这个乱码的过程有点繁琐,而且每种不同的图表的解决方式还不一样,但有一点是一样的,就是修改默认的字体,让它支持中文字体的显示,这样乱码问题就解决了。
由于这里用的 1.0.9 这个版本不会出现中文乱码问题,所以在这里姑且不谈。接下来会用到 maven 来管理 jar 包,不使用 maven 的朋友可以直接将 struts2 和 JFreeChart 的
jar 包导进项目里就 OK 了,maven 不会影响接下来要谈的 JFreeChart 柱状图的生成。
JFreeChart 所必须的 jar 包:jcommon-1.0.12.jar、jfreechart-1.0.9.jar (这里说的是 JFreeChart 1.0.9 版本,版本不同的请自行对应 jar 包版本)
OK,废话不多说,直接进入主题:
JFreeChart 组件中有个
JFreeChart类,它代表图表对象。生成任何类型的图表都要通过该对象,JFreeChart 组件提供了一个工厂类ChartFactory,用来创建各种类型的图表对象。
创建普通柱状图:ChartFactory.createBarChart( … )
创建 3D 柱状图:ChartFactory.createBarChart3D( … )
绘制 3D 柱状图的方法及方法入口参数:
ChartFactory.createBarChart3D(String title, String categoryAxisLabel, String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation,
boolean legend, boolean tooltips, boolean urls)
参数1:String title —— 图表标题
参数2:String categoryAxisLabel —— 统计种类轴标题,可以理解为X轴标题
参数3:String valueAxisLabel —— 统计值轴标题,可以理解为y轴标题
参数4:CategoryDataset dataset —— 绘图数据集
参数5:PlotOrientation orientation —— 设定柱形图的绘制方向,PlotOrientation.VERTICAL(垂直),PlotOrientation.HORIZONTAL(水平)
参数6:boolean legend —— 设定是否显示图例
参数7:boolean tooltips —— 设定是否采用标准生成器
参数8:boolean urls —— 设定是否包生成链接
创建 maven 项目(不使用 maven 的朋友在 myeclipse 创建 Web 项目,或在 eclipse 下创建动态 Web 项目),项目名起: jfreechart-demo
web.xml 配置:
struts.xml 配置(这里使用了 Struts2 的 convention 插件来实现零配置,没有使用
convention 插件的朋友请自行配置相应的 action):
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"
>
<
struts
>
<
constant
name
="struts.devMode"
value
="true"
/>
<!--
开发模式
-->
<
constant
name
="struts.i18n.encoding"
value
="UTF-8"
/>
<!--
Web运用编码
-->
<
constant
name
="struts.convention.result.path"
value
="/view/"
/>
<!--
结果资源的路径
-->
<
constant
name
="struts.convention.action.name.separator"
value
="_"
/>
<!--
URL资源分隔符
-->
<
constant
name
="struts.convention.classes.reload"
value
="true"
/>
<!--
convention类重新加载
-->
<
constant
name
="struts.action.extension"
value
="action,do,html"
/>
<!--
请求后缀
-->
</
struts
>
pom.xml 配置(不使用 maven 的朋友不用配置这个文件,直接将需要的 jar 包导进项目即可):
(
核心类,主要看这里就行,你可以将 execute 方法里面的代码直接拷贝到 jsp 上面做测试)
package com.fancy.action;
import java.awt.Color;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
/**
* -----------------------------------------
* @描述 柱状图
* @作者 fancy
* @邮箱 fancydeepin@yeah.net
* @日期 2012-8-6 <p>
* -----------------------------------------
*/
public
class CylinderAction
extends BaseAction
{
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
private static final long serialVersionUID = 1L;
private String fileName;
public String execute() throws Exception{
//模拟数据
double[][] data = {{1185,995,1286,1210},{916,1028,900,885},{982,763,935,665},{384,568,928,773}};
String[] rowKeys = {"A产品","B产品","C产品","D产品"};
String[] columKeys = {"E-1区","E-2区","E-3区","E-4区"};
//创建Dataset对象
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columKeys, data);
//创建3D柱状图
JFreeChart chart = ChartFactory.createBarChart3D("2011年产品销售量", "", "销量/件", dataset, PlotOrientation.VERTICAL, true, true, false);
//设置背景颜色
chart.setBackgroundPaint(Color.WHITE);
fileName = ServletUtilities.saveChartAsPNG(chart, 700, 400, null, getHttpSession());
return "cylinder";
}
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
public String getFileName() {
return fileName;
}
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
}
在 webapp 目录下创建 view 子目录,在 view 目录里创建 cylinder.jsp 文件(不使用 maven 的朋友 jsp 文件位置请自行对应)
cylinder.jsp 文件:
访问:
http://localhost:8080/jfreechart-demo/cylinder.html
(没有使用
convention 插件的朋友,访问地址请自行对应
)结果如图:
在上图中,可以大概的看出产品的销售量在哪个范围之内,但是并没有具体的数值,下面通过在 CylinderAction 类上添加代码来使得这些数值能够被显示:
package com.fancy.action;
import java.awt.Color;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.ui.TextAnchor;
/**
* -----------------------------------------
* @描述 柱状图
* @作者 fancy
* @邮箱 fancydeepin@yeah.net
* @日期 2012-8-6 <p>
* -----------------------------------------
*/
public
class CylinderAction
extends BaseAction
{
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
private static final long serialVersionUID = 1L;
private String fileName;
public String execute() throws Exception{
//模拟数据
double[][] data = {{1185,995,1286,1210},{916,1028,900,885},{982,763,935,665},{384,568,928,773}};
String[] rowKeys = {"A产品","B产品","C产品","D产品"};
String[] columKeys = {"E-1区","E-2区","E-3区","E-4区"};
//创建Dataset对象
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columKeys, data);
//创建3D柱状图
JFreeChart chart = ChartFactory.createBarChart3D("2011年产品销售量", "", "销量/件", dataset, PlotOrientation.VERTICAL, true, true, false);
//设置背景颜色
chart.setBackgroundPaint(Color.WHITE);
//创建柱体绘制器对象
BarRenderer3D renderer = new BarRenderer3D();
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
//设置柱体数值可见
renderer.setBaseItemLabelsVisible(true);
//调整数值显示位置
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
renderer.setItemLabelAnchorOffset(10D);
chart.getCategoryPlot().setRenderer(renderer);
fileName = ServletUtilities.saveChartAsPNG(chart, 700, 400, null, getHttpSession());
return "cylinder";
}
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
public String getFileName() {
return fileName;
}
![](https://i-blog.csdnimg.cn/blog_migrate/d18c02628675d0a2c816449d98bda930.gif)
}
再次访问:
http://localhost:8080/jfreechart-demo/cylinder.html
结果如图:
[ 随笔均原创,转载请注明出处:http://www.blogjava.net/fancydeepin ]
转载自: http://www.blogjava.net/fancydeepin/archive/2012/08/07/java_jfreechart_barchart3d.html