package com.***t.group;java
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;dom
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;ide
/**
* 項目名稱:fit
* 類名稱:CreatePicByJFreeChart
* 類描述:生成走勢圖的處理類
* 建立人:郭洪治
* 建立時間:Mar 15, 2010 10:15:22 AM
* @version
*/
public class CreatePicByJFreeChart {orm
/**
* 功能:根據傳入的數據生成指定目錄的走勢圖的處理方法。
* @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 要生成圖片存儲的目錄,默認爲p_w_picpaths
* @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("/"+"p_w_picpaths");
}
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 要生成圖片存儲的目錄,默認爲p_w_picpaths
* @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("/"+"p_w_picpaths");
}
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;
}
}
}
ci