JFreeChart是何物?熟悉java web 编程的朋友们不会陌生,它是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。
现在让我们用最简单的方式把JFreechart和流行框架Structs整合起来吧。
第一步,导入所需要的包:
jcommon-1.0.16.jar,jfreechart-1.0.13.jar,struts2-jfreechart-plugin-2.1.6.jar
如果包没导好的话,后面的页面中<package name="QQ" extends="jfreechart-default">会报错的~
第二步,新建页面:
新建一个页面,其中显示包含有JFreechart生成的图:
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@page import="java.util.Date"%>
<%@page import="com.softeem.action.QQ_Count_Action"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>网络日志管理</title>
</head>
<body>
<span>饼状图</span>
<table>
<tr>
<td>
<img alt="jfreechart" src="jfreechart!execute_exe" />
</td>
<td>
<img alt="jfreechart1" src="jfreechart1.action" />
</td>
</tr>
</table>
<span>柱状图</span>
<table>
<tr>
<td>
<img alt="jfreechart2" src="jfreechart!execute_exe1" />
</td>
<td>
<img alt="jfreechart3" src="jfreechart!execute_exe2" />
</td>
</tr>
</table>
<span>拆线图</span>
<table>
<tr>
<td>
<img alt="jfreechart4" src="jfreechart!execute_exe3"/>
</td>
<td>
</td>
</tr>
</table>
</body>
</html>
第三步,配置structs.xml
由于我们需要把JFreechart和structs整合,所以需要在structs.xml中配置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.ognl.allowStaticMethodAccess" value="true"></constant>
<!-- 中文问题 -->
<constant name="struts.i18n.encoding" value="gbk" />
<package name="QQ" extends="jfreechart-default">
<action name="jfreechart" class="com.softeem.action.JfreeCharAction"> <!-- 配置页面中使用的action -->
<result name="success" type="chart">
<param name="width">600</param> <!-- 设置生成的图片大小 -->
<param name="height">400</param>
</result>
</action>
<action name="jfreechart1" class="com.softeem.action.QQ_Count_Action">
<result name="success" type="chart">
<param name="width">600</param>
<param name="height">400</param>
</result>
</action>
<action name="jfreechart2" class="com.softeem.action.JfreeCharAction">
<result name="success" type="chart">
<param name="width">600</param>
<param name="height">400</param>
</result>
</action>
<action name="jfreechart3" class="com.softeem.action.JfreeCharAction">
<result name="success" type="chart">
<param name="width">600</param>
<param name="height">400</param>
</result>
</action>
<action name="jfreechart4" class="com.softeem.action.JfreeCharAction">
<result name="success" type="chart">
<param name="width">600</param>
<param name="height">400</param>
</result>
</action>
</package>
</struts>
第四步,新建action
我们需要根据刚刚structs.xml中配置的class名字来新建action,并在其中完成生成jfreechart图表的功能。
package jfreeChart;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
public class JfreeChartTest {
public static JFreeChart createChart() throws IOException {
// 数据集
DefaultPieDataset dpd = new DefaultPieDataset();
dpd.setValue("QQ", 25);
dpd.setValue("MSN", 25);
dpd.setValue("飞信", 45);
dpd.setValue("其它", 10);
// 创建PieChart对象
JFreeChart chart = ChartFactory.createPieChart3D("海蜘蛛上网情况", dpd, true,
true, false);
utils.setFont(chart);
return chart;
}
public static JFreeChart createZhuChart() throws IOException {
JFreeChart chart = ChartFactory.createBarChart3D("图书销量统计图", // 图表标题
"图书", // 目录轴的显示标签
"销量", // 数值轴的显示标签
getDataSet(), // 数据集
// PlotOrientation.HORIZONTAL , // 图表方向:水平
PlotOrientation.VERTICAL, // 图表方向:垂直
false, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
// 重新设置图标标题,改变字体
chart
.setTitle(new TextTitle("图书销量统计图", new Font("黑体", Font.ITALIC,
22)));
CategoryPlot plot = (CategoryPlot) chart.getPlot();
// 取得横轴
CategoryAxis categoryAxis = plot.getDomainAxis();
// 设置横轴显示标签的字体
categoryAxis.setLabelFont(new Font("宋体", Font.BOLD, 22));
// 分类标签以45度角倾斜
categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
categoryAxis.setTickLabelFont(new Font("宋体", Font.BOLD, 18));
// 取得纵轴
NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
// 设置纵轴显示标签的字体
numberAxis.setLabelFont(new Font("宋体", Font.BOLD, 22));
FileOutputStream fos = null;
fos = new FileOutputStream("book.jpg");
// 将统计图标输出成JPG文件
ChartUtilities.writeChartAsJPEG(fos, // 输出到哪个输出流
1, // JPEG图片的质量,0~1之间
chart, // 统计图标对象
800, // 宽
600,// 宽
null // ChartRenderingInfo 信息
);
fos.close();
return chart;
}
private static CategoryDataset getDataSet() {//为生成chart的方法提供数据
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(47000, "", "Spring2.0宝典");
dataset.addValue(38000, "", "轻量级J2EE企业实战");
dataset.addValue(31000, "", "基于J2EE的Ajax宝典");
dataset.addValue(29000, "", "JavaScript权威指南");
dataset.addValue(25000, "", "Ajax In Action");
return dataset;
}
public static JFreeChart createZhuChart1() throws IOException {//生成chart对象,用于自动绘制图表
JFreeChart chart = ChartFactory.createBarChart3D(
"图书销量统计图", // 图表标题
"图书", // 目录轴的显示标签
"销量", // 数值轴的显示标签
getDataSet1(), // 数据集
//PlotOrientation.HORIZONTAL , // 图表方向:水平
PlotOrientation.VERTICAL , // 图表方向:垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
//重新设置图标标题,改变字体
chart.setTitle(new TextTitle("图书销量统计图", new Font("黑体", Font.ITALIC , 22)));
//取得统计图标的第一个图例
LegendTitle legend = chart.getLegend(0);
//修改图例的字体
legend.setItemFont(new Font("宋体", Font.BOLD, 14));
CategoryPlot plot = (CategoryPlot)chart.getPlot();
//取得横轴
CategoryAxis categoryAxis = plot.getDomainAxis();
//设置横轴显示标签的字体
categoryAxis.setLabelFont(new Font("宋体" , Font.BOLD , 22));
//分类标签以45度角倾斜
categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
categoryAxis.setTickLabelFont(new Font("宋体" , Font.BOLD , 18));
//取得纵轴
NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();
//设置纵轴显示标签的字体
numberAxis.setLabelFont(new Font("宋体" , Font.BOLD , 22));
FileOutputStream fos = null;
fos = new FileOutputStream("book.jpg");
//将统计图标输出成JPG文件
ChartUtilities.writeChartAsJPEG(
fos, //输出到哪个输出流
1, //JPEG图片的质量,0~1之间
chart, //统计图标对象
800, //宽
600,//宽
null //ChartRenderingInfo 信息
);
fos.close();
return chart;
}
//返回一个CategoryDataset实例
private static CategoryDataset getDataSet1()
{
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(45000 , "北京" , "Spring2.0宝典");
dataset.addValue(38000 , "北京" , "轻量级J2EE企业实战");
dataset.addValue(24000 , "北京" , "基于J2EE的Ajax宝典");
dataset.addValue(32000 , "北京" , "JavaScript权威指南");
dataset.addValue(21000 , "北京" , "Ajax In Action");
dataset.addValue(37000 , "上海" , "Spring2.0宝典");
dataset.addValue(36000 , "上海" , "轻量级J2EE企业实战");
dataset.addValue(34000 , "上海" , "基于J2EE的Ajax宝典");
dataset.addValue(42000 , "上海" , "JavaScript权威指南");
dataset.addValue(12000 , "上海" , "Ajax In Action");
dataset.addValue(42000 , "广州" , "Spring2.0宝典");
dataset.addValue(40000 , "广州" , "轻量级J2EE企业实战");
dataset.addValue(34000 , "广州" , "基于J2EE的Ajax宝典");
dataset.addValue(18000 , "广州" , "JavaScript权威指南");
dataset.addValue(26000 , "广州" , "Ajax In Action");
return dataset;
}
/**
* 获取折线图表
*/
public static JFreeChart createLineChart(){//生成折线图的方法
CategoryDataset dataset = getBarDataset();
JFreeChart lineChart = ChartFactory.createLineChart("水果产量图",
"水果",
"产量",
dataset,
PlotOrientation.VERTICAL,
true,
true,
false);
lineChart.getTitle().setFont(new Font("华文新魏",Font.BOLD,32));
Font font = new Font("黑体",Font.BOLD,15);
lineChart.getLegend().setItemFont(font); //设置引用标签的字体
CategoryPlot linePlot = lineChart.getCategoryPlot(); //获取图表
//设置网格的颜色(纵向和横向网格线条颜色以及可见性)
linePlot.setBackgroundPaint(Color.LIGHT_GRAY);
linePlot.setRangeGridlinesVisible(true); //设置横向网格的可见性
linePlot.setRangeGridlinePaint(Color.black);
linePlot.setDomainGridlinesVisible(true); //设置纵向网格的可见性
linePlot.setDomainGridlinePaint(Color.black);
CategoryAxis categoryAxis = linePlot.getDomainAxis(); //目录轴(即横坐标)
categoryAxis.setLabelPaint(Color.blue);
categoryAxis.setLabelFont(font); //设置目录轴上的标签字体
categoryAxis.setTickLabelFont(font); //设置目录轴上标记字体
org.jfree.chart.axis.ValueAxis valueAxis = linePlot.getRangeAxis(); //数值轴(即纵坐标)
valueAxis.setAutoRange(false); //数值轴不自动设置数值
valueAxis.setAutoRangeMinimumSize(30); //自动设置数据轴数据范围时数据范围的最小跨度
valueAxis.setUpperBound(300); //数值轴的最大值为300
valueAxis.setLowerBound(60); //数值轴最小值为60
valueAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); //数值轴显示整数
valueAxis.setLabelFont(font);
org.jfree.chart.renderer.category.LineAndShapeRenderer renderer = (org.jfree.chart.renderer.category.LineAndShapeRenderer)linePlot.getRenderer();//获取线条
renderer.setShapesVisible(true); //设置连接点是否显示
float aa[] = {5.0f};
BasicStroke realLine = new BasicStroke(1.8f); //实线
BasicStroke dashLine = new BasicStroke(2.2f, //虚线
BasicStroke.CAP_ROUND, //端点风格
BasicStroke.JOIN_ROUND, //连接点风格
8f,
aa,
0.6f);
for(int i = 0,length = dataset.getColumnCount();i<length;i++){
if(i%2==0){
renderer.setSeriesStroke(i,dashLine);
}else{
renderer.setSeriesStroke(i,realLine);
}
}
return lineChart;
}
private static CategoryDataset getBarDataset(){
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(110, "北京","苹果");
dataset.addValue(150, "上海","苹果");
dataset.addValue(140, "广州","苹果");
dataset.addValue(120, "北京","荔枝");
dataset.addValue(150, "上海","荔枝");
dataset.addValue(130, "广州","荔枝");
dataset.addValue(90, "北京","香蕉");
dataset.addValue(160, "上海","香蕉");
dataset.addValue(200, "广州","香蕉");
dataset.addValue(210, "北京","橘子");
dataset.addValue(140, "上海","橘子");
dataset.addValue(180, "广州","橘子");
dataset.addValue(100, "北京","菠萝");
dataset.addValue(150, "上海","菠萝");
dataset.addValue(120, "广州","菠萝");
return dataset;
}
}
/**
* 设置字体
*
* @author zyong
*
*/
class utils {
public static void setFont(JFreeChart chart) {
Font font = new Font("宋体", Font.ITALIC, 12);
PiePlot plot = (PiePlot) chart.getPlot();
chart.getTitle().setFont(font);
plot.setLabelFont(font);
chart.getLegend().setItemFont(font);
}
}
第五步,改变背景颜色
由于我的web页面的背景是黑色,JFreechart默认的背景颜色为白色,十分刺眼,顾我琢磨了一下把它的背景颜色改了,在此和大家分享一下。
// 设置总的背景颜色,这是最底层背景的颜色
chart.setBackgroundPaint(ChartColor.WHITE);
// 设置标题颜色
chart.getTitle().setPaint(ChartColor.blue);
// 获得图表对象
CategoryPlot p = chart.getCategoryPlot();
// 设置图的背景颜色,这是出于第二层的背景颜色,也就是图像周围边框的颜色
p.setBackgroundPaint(ChartColor.WHITE);
// 设置表格线颜色
p.setRangeGridlinePaint(ChartColor.red);