package com.ssrt.group;
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
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.NumberAxis;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
/**
* 项目名称:fit
* 类名称:CreatePicByJFreeChart
* 类描述:生成走势图的处理类
* 创建人:郭洪治
* 创建时间:Mar 15, 2010 10:15:22 AM
* @version
*/
public class CreatePicByJFreeChart {
/**
* 功能:根据传入的数据生成指定目录的走势图的处理方法。
* @param List list 生成图所需要的list集合
* @param String CateGory X轴对应的字段
* @param String value Y轴对应的字段
* @param String series 底部显示的标题
* @param int width 生成图片的宽
* @param int height 生成图片的高
* @param HttpServletRequest request 当前的request
* @param String picDir 要生成图片存储的目录,默认为images
* @return String 返回生成图片的全路径和名称
*/
@SuppressWarnings( { "unchecked", "deprecation" })
public static String createXYLinePic(List list, String CateGory,String value, String series, int width, int height,HttpServletRequest request, String picDir) {
try {
Method metd = null;
String fdname = null;
String seriesTemp = series;
DefaultCategoryDataset linedataset = new DefaultCategoryDataset();
// 遍历集合
for (Object object : list) {
// 获取集合中的对象类型
Class clazz = object.getClass();
// 获取他的字段数组
Field[] fds = clazz.getDeclaredFields();
Object f1 = null;
Object f2 = null;
Object objTitle = null;
// 遍历该数组Field field : fds
for (Field field : fds) {
// 得到字段名
fdname = field.getName();
// 对象序列化常量没有set和get方法。
if (!fdname.equals("serialVersionUID")) {
// 根据字段名找到对应的get方法,null表示无参数
metd = clazz.getMethod("get" + change(fdname), null);
}
// 比较是否在字段数组中存在name字段,如果不存在短路,如果存在继续判断该字段的get方法是否存在,同时存在继续执行
if (CateGory.equals(fdname) && metd != null) {
// 调用该字段的get方法
f1 = metd.invoke(object, null);
}
// 同上
if (value.equals(fdname) && metd != null) {
f2 = metd.invoke(object, null);
}
if (fdname.equals(series)) {
objTitle = metd.invoke(object, null);
seriesTemp = objTitle.toString();
}
}
linedataset.addValue(Double.parseDouble(f2.toString()),seriesTemp, f1.toString());
}
// 定义图表对象
JFreeChart jfreechart = ChartFactory.createLineChart("", "", "",linedataset, PlotOrientation.VERTICAL, true, true, false);
CategoryPlot categoryplot = (CategoryPlot) jfreechart.getPlot();
// 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot.getRenderer();
categoryplot.setBackgroundPaint(Color.lightGray);
// 设置网格线的颜色
categoryplot.setRangeGridlinePaint(Color.black);
NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
CategoryAxis domainAxis = categoryplot.getDomainAxis();
//设置X轴坐标上的文字
domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));
//设置X轴的标题文字
domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
//设置Y轴坐标上的文字
numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));
//设置Y轴的标题文字
numberaxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));
//这句代码解决了底部汉字乱码的问题
jfreechart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
numberaxis.setAutoRangeIncludesZero(true);
// series 点(即数据点)可见
lineandshaperenderer.setShapesVisible(true);
// 定义series为”First”的(即series1)点之间的连线 ,这里是虚线,默认是直线
// lineandshaperenderer.setSeriesStroke(0, new BasicStroke(2.0F, 1,1, 1.0F, new float[] {10F, 6F }, 0.0F));
//判断目录
String dir = "";
if(!"".equals(picDir) && picDir != null){
dir = request.getSession().getServletContext().getRealPath("/"+picDir);
File file = new File(dir);
if(!file.exists()){
file.mkdir();
}
}
//目录如果不指定时,则默认目录为Images
else {
dir = request.getSession().getServletContext().getRealPath("/"+"images");
}
String picPathName = dir+"/"+"pic.jpg";
ChartUtilities.saveChartAsJPEG(new File(picPathName), jfreechart,width, height);
return picPathName;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 功能:根据传入的数据生成指定目录的饼图的处理方法。
* @param List list 生成图所需要的list集合
* @param String CateGory 标题对应的字段
* @param String value 数据对应的字段
* @param int width 生成图片的宽
* @param int height 生成图片的高
* @param HttpServletRequest request 当前的request
* @param String picDir 要生成图片存储的目录,默认为images
* @return String 返回生成图片的全路径和名称
*/
@SuppressWarnings("unchecked")
public static String createPIEPic(List list, String CateGory,String value, int width, int height,HttpServletRequest request, String picDir) {
try {
Method metd = null;
String fdname = null;
DefaultPieDataset ds = new DefaultPieDataset();
// 遍历集合
for (Object object : list) {
// 获取集合中的对象类型
Class clazz = object.getClass();
// 获取他的字段数组
Field[] fds = clazz.getDeclaredFields();
Object f1 = null;
Object f2 = null;
@SuppressWarnings("unused")
Object objTitle = null;
// 遍历该数组Field field : fds
for (Field field : fds) {
// 得到字段名
fdname = field.getName();
// 对象序列化常量没有set和get方法。
if (!fdname.equals("serialVersionUID")) {
// 根据字段名找到对应的get方法,null表示无参数
metd = clazz.getMethod("get" + change(fdname), null);
}
// 比较是否在字段数组中存在name字段,如果不存在短路,如果存在继续判断该字段的get方法是否存在,同时存在继续执行
if (CateGory.equals(fdname) && metd != null) {
// 调用该字段的get方法
f1 = metd.invoke(object, null);
}
// 同上
if (value.equals(fdname) && metd != null) {
f2 = metd.invoke(object, null);
}
}
ds.setValue(f1.toString(),Double.parseDouble(f2.toString()) );
}
//判断目录
String dir = "";
if(!"".equals(picDir) && picDir != null){
dir = request.getSession().getServletContext().getRealPath("/"+picDir);
File file = new File(dir);
if(!file.exists()){
file.mkdir();
}
}
//目录如果不指定时,则默认目录为Images
else {
dir = request.getSession().getServletContext().getRealPath("/"+"images");
}
String picPathName = dir+"/"+"pic.jpg";
JFreeChart jfc = ChartFactory.createPieChart3D("", ds, true, false, false);
//通过JFreeChart 对象获得
PiePlot pieplot = (PiePlot) jfc.getPlot();
// 没有数据的时候显示的内容
pieplot.setNoDataMessage("无数据可供显示!");
/* 解决底部和图上文字乱码问题 start*/
jfc.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 14));
pieplot.setLabelFont(new Font("宋体", Font.BOLD, 10));
/* 解决底部和图上文字乱码问题 end*/
pieplot.setLabelGenerator(new StandardPieSectionLabelGenerator(("{0}({2})"), NumberFormat.getNumberInstance(), new DecimalFormat("0.00%")));
ChartUtilities.saveChartAsJPEG(new File(picPathName), jfc, width,height);
return picPathName;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 功能:将传入的字符串的第一个字母转换为大写的处理方法
* @param String src 源字符串
* @return String
*/
public static String change(String src) {
if (src != null) {
StringBuffer sb = new StringBuffer(src);
sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
return sb.toString();
} else {
return null;
}
}
}
本文出自 “紫晶幻治” 博客,谢绝转载!