package demo;
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.FileOutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
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.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
/**
* 生成兩個日期間的以天為間隔的折線圖
* @throws ParseException
*/
public class MyLineAndShapeChart {
public CategoryPlot getLineAndShapeChart() throws ParseException {
//準備生成數據源需要的要素
List<String> dateList = new ArrayList<String>();
List<Double> valList = new ArrayList<Double>();
String start = "2008-01-21";
String end = "2008-02-08";
//字符串轉換成日期
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
Date startDate=format.parse(start);
Calendar startTime=Calendar.getInstance();
startTime.clear();
startTime.setTime(startDate);
int startYear = startTime.get(Calendar.YEAR);
int startMonth = startTime.get(Calendar.MONTH);
int startDay = startTime.get(Calendar.DAY_OF_MONTH);
Date endDate=format.parse(end);
Calendar endTime=Calendar.getInstance();
endTime.clear();
endTime.setTime(endDate);
int endYear = endTime.get(Calendar.YEAR);
int endMonth = endTime.get(Calendar.MONTH);
int endDay = endTime.get(Calendar.DAY_OF_MONTH);
System.out.println("注意西方的月份從0到11,中國的月份從1到12");
System.out.println("下面輸入的是中國的日期.注意其中的轉換問題");
System.out.println("start date : " + start);
System.out.println("end date : " + end);
int count = 0;
for (int x = startYear; x <= endYear; x++) {
//羅馬歷法產生年份公元1582年
int gregorianCutoverYear = 1582;
boolean isLeapYear = x >= gregorianCutoverYear ?
((x%4 == 0) && ((x%100 != 0) || (x%400 == 0))) :
(x%4 == 0);
//判斷是否是閏年
//java方法
//boolean isLeapYear = (new GregorianCalendar()).isLeapYear(x);
String isBigYear = "是平年";
if (isLeapYear) {
isBigYear = "是閏年";
}
System.out.println(x + "年" + isBigYear);
//獲取開始月的最大天數
//java方法
//SimpleDateFormat aFormat=new SimpleDateFormat("yyyy-MM-dd");
//Date date = aFormat.parse(start);
//Calendar time = Calendar.getInstance();
//time.clear();
//time.setTime(date);
//int max=time.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天數
//System.out.println(max);
//獲取開始月的最大天數;大月是1,3,5,7,8,10,12;小月是4,6,9,11;特殊月是2
int max = 0;
if (startMonth == 1) {
if (isLeapYear) {
max = 29;
}
if (!isLeapYear) {
max = 28;
}
}
if (startMonth == 3 || startMonth == 5 || startMonth == 8 || startMonth == 10) {
max = 30;
}
if (startMonth == 0 || startMonth == 2 || startMonth == 4 || startMonth == 6 || startMonth == 7 || startMonth == 9 || startMonth == 11) {
max = 31;
}
//循環每個月
//如果在日期范圍內月份循環時自增到了一年的最后一個月就將月份初始化到一月份
int y = 0;
//如果是開始日期的第一個年的月數就從開始月數循環
if (x == startYear) {
y = startMonth;
}
for (; y < 12; y++) {
//獲取當月的最大天數;大月是1,3,5,7,8,10,12;小月是4,6,9,11;特殊月是2
max = 0;
if (y == 1) {
if (isLeapYear) {
max = 29;
}
if (!isLeapYear) {
max = 28;
}
}
if (y == 3 || y == 5 || y == 8 || y == 10) {
max = 30;
}
if (y == 0 || y == 2 || y == 4 || y == 6 || y == 7 || y == 9 || y == 11) {
max = 31;
}
int ty = y + 1;
System.out.println(x + "年" + ty + "月");
//循環每一天
int z = 1;
//如果是開始日期的第一個月的天數就從開始天數循環
if (x == startYear && y == startMonth) {
z = startDay;
}
for (; z <= max; z++) {
count++;
String str = x + "年" + ty + "月" + z + "日";//日期格式可以調整
System.out.println(str);
dateList.add(str);
double val = x + y * z * 100;//實際的值應該從數據庫中獲取
valList.add(new Double(val));
if (x == endYear && y == endMonth && z == endDay) {
break;
}
}
//如果已經遍歷過了截至日期的最后月份就中止月份的循環
if (x == endYear && y == endMonth) {
break;
}
}
}
System.out.println(start + " 到 " + end + " 的天數差:" + count);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
String[] rowKeys = { "上限值", "下限值", "重量" };
String[] columnKeys = new String[count];
double[][] data = new double[3][count];
for (int i = 0; i < count; i++) {
columnKeys[i] = dateList.get(i);
data[0][i] = 2500;
data[1][i] = 1500;
data[2][i] = valList.get(i).doubleValue();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
JFreeChart chart = ChartFactory.createLineChart("工藝秤日稱重重量趨勢圖", "日期", "總量",
dataset, PlotOrientation.VERTICAL, true, true, false);
chart.setTextAntiAlias(false);
chart.setBackgroundPaint(Color.WHITE);
// 設置圖標題的字體重新設置title
Font font = new Font("隸書", Font.BOLD, 25);
TextTitle title = new TextTitle("工藝秤日稱重重量趨勢圖");
title.setFont(font);
chart.setTitle(title);
// 設置面板字體
Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
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));
CategoryAxis domainAxis = categoryplot.getDomainAxis();
domainAxis.setLabelFont(labelFont);// 軸標題
domainAxis.setTickLabelFont(labelFont);// 軸數值
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 橫軸上的
// Lable
// 45度傾斜
// 設置距離圖片左端距離
domainAxis.setLowerMargin(0.0);
// 設置距離圖片右端距離
domainAxis.setUpperMargin(0.0);
NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
// 獲得renderer 注意這里是下嗍造型到lineandshaperenderer!!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot
.getRenderer();
lineandshaperenderer.setBaseShapesVisible(true); // series 點(即數據點)可見
lineandshaperenderer.setBaseLinesVisible(true); // series 點(即數據點)間有連線可見
// 顯示折點數據
// lineandshaperenderer.setBaseItemLabelGenerator(new
// StandardCategoryItemLabelGenerator());
// lineandshaperenderer.setBaseItemLabelsVisible(true);
//打印到服務器
FileOutputStream fos_jpg = null;
//String dirs = "C:/workspace/test/map/";
String dirs = "F:/test/";
String fileName = "lineAndShap.png";
String chartName = dirs + fileName;
try {
File file = new File(dirs);
if (!file.exists()) {
file.mkdirs();
}
fos_jpg = new FileOutputStream(chartName);
// 將報表保存為png文件
ChartUtilities.writeChartAsPNG(fos_jpg, chart, 1500, 510);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
fos_jpg.close();
System.out.println("ok");
} catch (Exception e) {
e.printStackTrace();
}
}
//輸出到瀏覽器
return categoryplot;
}
servlet的doGet方法中代碼
response.setContentType("text/html");
System.out.println("line");
String factory = request.getParameter("factory");
System.out.println(factory);
MyLineAndShapeChart my = new MyLineAndShapeChart();
CategoryPlot mm = new CategoryPlot();
try {
mm = my.getLineAndShapeChart();
} catch (ParseException e) {
e.printStackTrace();
}
JFreeChart chart = new JFreeChart("ssssssss", JFreeChart.DEFAULT_TITLE_FONT,
mm, true);
ChartRenderingInfo info = new ChartRenderingInfo(
new StandardEntityCollection());
String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300,
info, request.getSession());
String graphURL = request.getContextPath()
+ "/servlet/DisplayChart?filename=" + filename;
RequestDispatcher rd = request.getRequestDispatcher("../form/g.jsp");
request.getSession().setAttribute("filename", filename);
request.getSession().setAttribute("graphURL", graphURL);
rd.forward(request, response);
webInfo下的g.jsp代碼
<%@ page contentType="text/html;charset=GBK"%>
<HTML>
<HEAD>
</HEAD>
<BODY>
<P ALIGN="CENTER">
<img src="${graphURL}" width=500 height=300 border=0
usemap="${filename}">
</P>
</BODY>
</HTML>
web.xml 文件中內容(重要)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>
org.jfree.chart.servlet.DisplayChart
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/servlet/DisplayChart</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>servlet.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/servlet/AServlet</url-pattern>
</servlet-mapping>
</web-app>
柳德才
13691193654
18942949207
QQ:422157370
liudecai_zan@126.com湖北-武漢-江夏-廟山