需要包: jcommon-1.0.16.jar、jfreechart-1.0.13.jar
1. 創建圖表工具類 JFreeChartUtils.java
package com.pcm.fnd.util;
import java.awt.Color;
import java.awt.Font;
import java.text.DecimalFormat;
import org.jfree.chart.ChartFactory;
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.axis.NumberTickUnit;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
/**
* 創建圖表工具類
* @author qiyh
* @date 2011-08-10
*
*/
public class JFreeChartUtils {
/**
* 折線圖
* @param chartTitle:
* 標題
* @param showX:
* X軸顯示的說明文字
* @param showY:
* Y軸顯示的說明文字
* @param xyDataset:
* 數據集
* @param maxrange:
* Y軸最大值
* @param showCornerValue:
* 是否在拐點數據值
* @return JFreeChart
*/
public static JFreeChart createLineXYChart(String chartTitle, String showX, String showY,
CategoryDataset xyDataset, double maxrange, boolean showCornerValue) {
JFreeChart chart = ChartFactory.createLineChart(chartTitle, showX, showY,
xyDataset, PlotOrientation.VERTICAL, true, true, false);
// chart.setTextAntiAlias(false);
// 設置背景
chart.setBackgroundPaint(Color.WHITE);
// 設置標題title
Font font = new Font("隸書", Font.PLAIN, 25);
TextTitle title = new TextTitle(chartTitle);
title.setFont(font);
chart.setTitle(title);
// 設置面板字體
Font labelFont = new Font("宋體", Font.CENTER_BASELINE, 12);
Font kfont = new Font("宋體", Font.CENTER_BASELINE, 13);// 底部圖例
chart.getLegend().setItemFont(kfont);
chart.setBackgroundPaint(Color.WHITE);
CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
// x軸 // 分類軸網格是否可見
categoryplot.setDomainGridlinesVisible(true);
// y軸 //數據軸網格是否可見
categoryplot.setRangeGridlinesVisible(true);
// 虛線色彩
categoryplot.setRangeGridlinePaint(Color.WHITE);
// 虛線色彩
categoryplot.setDomainGridlinePaint(Color.WHITE);
// 圖片背景顏色
categoryplot.setBackgroundPaint(Color.lightGray);
// 設置軸和麪板之間的距離
// categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
//沒有數據時顯示的文字說明。
categoryplot.setNoDataMessage("沒有數據!");
categoryplot.setNoDataMessagePaint(Color.RED);
// X軸
CategoryAxis domainAxis = categoryplot.getDomainAxis();
domainAxis.setLabelFont(labelFont);// x軸標題字體設置
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // x橫軸上45度傾斜
//設置最低的一個 Item 與圖片底端的距離
domainAxis.setLowerMargin(0.0);
//設置最高的一個 Item 與圖片頂端的距離
domainAxis.setUpperMargin(0.0);
// Y軸
ValueAxis rangeAxisv = categoryplot.getRangeAxis();
rangeAxisv.setLabelFont(labelFont);// y軸字體設置
rangeAxisv.setTickLabelFont(labelFont);// y軸字體設置
// 數
NumberAxis rangeAxis = (NumberAxis) categoryplot.getRangeAxis();
// 格式化
DecimalFormat decimalFormat = new DecimalFormat("0.0");
rangeAxis.setNumberFormatOverride(decimalFormat);
//設置Y軸的最小值
rangeAxis.setLowerBound(0);
//設置Y軸間隔單位
rangeAxis.setTickUnit(new NumberTickUnit(5D));
//設置Y軸的最大值
rangeAxis.setUpperBound(maxrange+3D);
// 獲得renderer 注意這裏是下嗍造型到lineandshaperenderer!!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot.getRenderer();
lineandshaperenderer.setBaseShapesVisible(true); // series 點(即數據點)可見
lineandshaperenderer.setBaseLinesVisible(true); // series 點(即數據點)間有連線可見
// 顯示折點數據
if (showCornerValue) {
lineandshaperenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
lineandshaperenderer.setBaseItemLabelsVisible(true);
}
return chart;
}
}
2. 請求服務器中的action
/**
* 率(百分比)
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
* @author qiyh
*/
public ActionForward showRate(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 初始化跳轉頁面
String forwordName = "showFaultAmountRate";
StatBIListForm theForm = (StatBIListForm) form;
FaultRateVO faultRateVo = theForm.getFaultRateVo();
// 當前時間
Calendar cl = Calendar.getInstance();
cl.setTime(new Date());
if (null == faultRateVo.getBeginYear()) {
faultRateVo.setBeginYear(String.valueOf(cl.get(Calendar.YEAR)-1));
}
if (null == faultRateVo.getBeginMonth()) {
faultRateVo.setBeginMonth(String.valueOf(cl.get(Calendar.MONTH)+1));
}
if (null == faultRateVo.getEndYear()) {
faultRateVo.setEndYear(String.valueOf(cl.get(Calendar.YEAR)));
}
if (null == faultRateVo.getEndMonth()) {
faultRateVo.setEndMonth(String.valueOf(cl.get(Calendar.MONTH)));
}
Date beginDate = parseStrToDate(faultRateVo.getBeginYear(), faultRateVo.getBeginMonth());
Date endDate = parseStrToDate(faultRateVo.getEndYear(), faultRateVo.getEndMonth());
// 參數
Map paraMap = new HashMap();
paraMap.put("beginDate",beginDate);
paraMap.put("endDate",endDate);
// 統計維度
String dimensionality = faultRateVo.getDimensionality();
StatBIListService statBIListService = (StatBIListService) this.getBeanFactory("statBIListService");
List getRate_list = null;
if ("models".equals(dimensionality)) {
List searchContentList = new ArrayList();
String searchContents = faultRateVo.getSearchContent();
if (null != searchContents) {
searchContents = searchContents.trim().replaceAll(",", ",");
if (0 < searchContents.indexOf(",")) {
String[] arry = searchContents.split(",");
for (int i = 0; i < arry.length; i++) {
searchContentList.add(arry[i]);
}
}else {
searchContentList.add(searchContents);
}
}
paraMap.put("searchContentArry", searchContentList);
// 從業務邏輯層查詢數據列表
getRate_list = statBIListService.queryForList("StatBIList.showFaultAmountRateByModels", paraMap);
}
// 生成圖表
String rateUrl = getRateUrl("故障損失率分析", getRate_list, false, request);
request.setAttribute("rateUrl", rateUrl);
theForm.setDataList(getRate_list);
// 跳轉到相應的頁面
return mapping.findForward(forwordName);
}
/**
* 生成圖表
* @param title
* 標題
* @param dataList
* 數據
* @param showValue
* 是否在拐點顯示值
* @param request
* request
* @return
*/
private String getRateUrl(String title, List dataList, boolean showValue, HttpServletRequest request){
String filename = null;
// 定義y軸最大值
double maxrange = 0D;
// 數據集
DefaultCategoryDataset line_dataset = new DefaultCategoryDataset();
if (null != dataList) {
for (Iterator iterator = dataList.iterator(); iterator.hasNext();) {
FaultRateVO faultAmountRateVo = (FaultRateVO) iterator.next();
if (null != faultAmountRateVo && null != faultAmountRateVo.getYearm()) {
// 統計實體
String statEntity = faultAmountRateVo.getStatEntity() != null ? faultAmountRateVo.getStatEntity() : "";
// 率
double rate = Double.parseDouble(faultAmountRateVo.getRate() != null ? faultAmountRateVo.getRate() : "0.00");
// 年月
String yearm = faultAmountRateVo.getYearm() != null ? faultAmountRateVo.getYearm() : "0";
maxrange = maxrange > rate ? maxrange : rate;
// 將數據添加至列表
line_dataset.addValue(rate, statEntity, yearm);
}
}
}
// 調用工具類生成折線圖
JFreeChart chart = JFreeChartUtils.createLineXYChart(title, null, "佔有率%", line_dataset, maxrange, showValue);
try {
filename = ServletUtilities.saveChartAsPNG(chart, 600, 400, null, request.getSession());
} catch (IOException e) {
e.printStackTrace();
}
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
return graphURL;
}