package table;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;

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.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.labels.StandardPieToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer;
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;
import org.jfree.data.time.Day;
import org.jfree.data.time.Hour;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.util.Rotation;

public class JFreeUtils {
	public static JFreeChart createPieChart(DefaultPieDataset dataset,
			String title, boolean is3D) {
		JFreeChart chart = null;
		if (is3D) {
			chart = ChartFactory.createPieChart3D(title, // 图表标题
					dataset, // 数据集
					true, // 是否显示图例
					true, // 是否显示工具提示
					true // 是否生成URL
					);
		} else {
			chart = ChartFactory.createPieChart(title, // 图表标题
					dataset, // 数据集
					true, // 是否显示图例
					true, // 是否显示工具提示
					true // 是否生成URL
					);
		}
		// 设置标题字体==为了防止中文乱码:必须设置字体
		chart.setTitle(new TextTitle(title, new Font("黑体", Font.ITALIC, 22)));
		// 设置图例的字体==为了防止中文乱码:必须设置字体
		chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 12));
		// 获取饼图的Plot对象(实际图表)
		PiePlot plot = (PiePlot) chart.getPlot();
		// 图形边框颜色
		plot.setBaseSectionOutlinePaint(Color.GRAY);
		// 图形边框粗细
		plot.setBaseSectionOutlineStroke(new BasicStroke(0.0f));
		// 设置饼状图的绘制方向,可以按顺时针方向绘制,也可以按逆时针方向绘制
		plot.setDirection(Rotation.ANTICLOCKWISE);
		// 设置绘制角度(图形旋转角度)
		plot.setStartAngle(70);
		// 设置突出显示的数据块
		// plot.setExplodePercent("One", 0.1D);
		// 设置背景色透明度
		plot.setBackgroundAlpha(0.7F);
		// 设置前景色透明度
		plot.setForegroundAlpha(0.65F);
		// 设置区块标签的字体==为了防止中文乱码:必须设置字体
		plot.setLabelFont(new Font("宋体", Font.PLAIN, 12));
		// 扇区分离显示,对3D图不起效
		if (is3D)
			plot.setExplodePercent(dataset.getKey(3), 0.1D);
		// 图例显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
		plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
				"{0}:{1}\r\n({2})", NumberFormat.getNumberInstance(),
				new DecimalFormat("0.00%")));
		// 图例显示百分比
		// plot.setLegendLabelGenerator(new
		// StandardPieSectionLabelGenerator("{0}={1}({2})"));
		// 指定显示的饼图为:圆形(true) 还是椭圆形(false)
		plot.setCircular(true);
		// 没有数据的时候显示的内容
		plot.setNoDataMessage("找不到可用数据...");
		// 设置鼠标悬停提示
		plot.setToolTipGenerator(new StandardPieToolTipGenerator());
		// 设置热点链接
		// plot.setURLGenerator(new StandardPieURLGenerator("detail.jsp"));

		return chart;
	}

	public static JFreeChart createBarChart(CategoryDataset dataset,
			String title, String x, String y, boolean is3D) {
		JFreeChart chart = null;
		if (is3D) {
			chart = ChartFactory.createBarChart3D( // 3D柱状图
					// JFreeChart chart = ChartFactory.createLineChart3D(
					// //3D折线图
					title, // 图表的标题
					x, // 目录轴的显示标签
					y, // 数值轴的显示标签
					dataset, // 数据集
					PlotOrientation.VERTICAL, // 图表方式:V垂直;H水平
					true, // 是否显示图例
					false, // 是否显示工具提示
					false // 是否生成URL
					);
		} else {
			chart = ChartFactory.createBarChart( // 柱状图
					// JFreeChart chart = ChartFactory.createLineChart3D(
					// //3D折线图
					title, // 图表的标题
					x, // 目录轴的显示标签
					y, // 数值轴的显示标签
					dataset, // 数据集
					PlotOrientation.VERTICAL, // 图表方式:V垂直;H水平
					true, // 是否显示图例
					false, // 是否显示工具提示
					false // 是否生成URL
					);
		}

		// ===============为了防止中文乱码:必须设置字体
		chart.setTitle(new TextTitle(title, new Font("黑体", Font.ITALIC, 22)));

		LegendTitle legend = chart.getLegend(); // 获取图例
		legend.setItemFont(new Font("宋体", Font.BOLD, 12)); // 设置图例的字体,防止中文乱码

		CategoryPlot plot = (CategoryPlot) chart.getPlot(); // 获取柱图的Plot对象(实际图表)
		// 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确)
		plot.setBackgroundPaint(new Color(255, 255, 204));
		plot.setForegroundAlpha(0.65F); // 设置前景色透明度

		// 设置横虚线可见
		plot.setRangeGridlinesVisible(true);
		// 虚线色彩
		plot.setRangeGridlinePaint(Color.gray);

		CategoryAxis h = plot.getDomainAxis(); // 获取x轴
		h.setMaximumCategoryLabelWidthRatio(1.0f);// 横轴上的 Lable 是否完整显示
		h.setLabelFont(new Font("宋体", Font.BOLD, 12));// 设置字体,防止中文乱码
		h.setTickLabelFont(new Font("宋体", Font.BOLD, 12));// 轴数值
		// h.setCategoryLabelPositions(CategoryLabelPositions.UP_45);//45度倾斜

		plot.getRangeAxis().setLabelFont(new Font("宋体", Font.BOLD, 12)); // Y轴设置字体,防止中文乱码

		// 柱图的呈现器
		BarRenderer renderer = new BarRenderer();
		// 设置柱子宽度
		// renderer.setMaximumBarWidth(0.05);
		// 设置柱子高度
		// renderer.setMinimumBarLength(0.2);
		// 设置柱子边框颜色
		renderer.setBaseOutlinePaint(Color.BLACK);
		// 设置柱子边框可见
		renderer.setDrawBarOutline(true);
		// 设置每个柱的颜色
		renderer.setSeriesPaint(0, Color.BLUE);
		renderer.setSeriesPaint(1, Color.GREEN);
		renderer.setSeriesPaint(2, Color.RED);
		// 设置每个地区所包含的平行柱的之间距离
		renderer.setItemMargin(0.05);
		// 显示每个柱的数值,并修改该数值的字体属性
		renderer.setIncludeBaseInRange(true);
		renderer
				.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer.setBaseItemLabelsVisible(true);
		// 设置柱的透明度
		plot.setForegroundAlpha(1.0f);
		// 给柱图添加呈现器
		plot.setRenderer(renderer);

		// 没有数据的时候显示的内容
		plot.setNoDataMessage("找不到可用数据...");

		return chart;
	}

	public static JFreeChart createLineChart(String chartTitle,
			String chartXdesc, String chartYdesc, String periodType,
			int dateInterval, String timeFormat, XYDataset dataSet) {
		JFreeChart chart = ChartFactory.createTimeSeriesChart(chartTitle,
				chartXdesc, chartYdesc, dataSet, true, false, false);
		// 设置标题
		chart.setTitle(new TextTitle(chartTitle,
				new Font("黑体", Font.ITALIC, 22)));
		LegendTitle legend = chart.getLegend();
		legend.setItemFont(new Font("宋体", Font.BOLD, 12)); // 设置图例的字体,防止中文乱码
		XYPlot xyplot = (XYPlot) chart.getXYPlot();
		xyplot.setBackgroundPaint(new Color(255, 255, 204));
		xyplot.setForegroundAlpha(0.65F); // 设置前景色透明度
		// 设置横虚线可见
		xyplot.setRangeGridlinesVisible(true);
		// 虚线色彩
		xyplot.setRangeGridlinePaint(Color.gray);
		xyplot.getRangeAxis().setLabelFont(new Font("宋体", Font.BOLD, 12)); // Y轴设置字体,防止中文乱码
		xyplot.getDomainAxis().setLabelFont(new Font("宋体", Font.BOLD, 12)); // X轴设置字体,防止中文乱码

		DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis();

		if (periodType.equalsIgnoreCase("MONTH")) {
			dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH,
					dateInterval));
		} else if (periodType.equalsIgnoreCase("DAY")) {
			dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,
					dateInterval));
		} else if (periodType.equalsIgnoreCase("HOUR")) {
			dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.HOUR,
					dateInterval));
		}
		dateaxis.setDateFormatOverride(new SimpleDateFormat(timeFormat));
		return chart;
	}

	private static boolean drawToOutputStream(String destPath,
			JFreeChart chart, int width, int heigth) {
		FileOutputStream fos = null;
		boolean returnValue = true;
		try {
			fos = new FileOutputStream(destPath);
			ChartUtilities.writeChartAsPNG(fos, // 指定目标输出流
					chart, // 图表对象
					width, // 宽
					heigth, // 高
					null); // ChartRenderingInfo信息
		} catch (IOException e) {
			e.printStackTrace();
			returnValue = false;
		} finally {
			try {
				fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
		return returnValue;
	}

	public static void 测试柱状图() {
		// 初始化数据
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.setValue(5000, "北京", "Corejava");
		dataset.setValue(3000, "上海", "Corejava");
		dataset.setValue(2000, "广州", "Corejava");

		dataset.setValue(10000, "北京", "JavaWeb");
		dataset.setValue(6000, "上海", "JavaWeb");
		dataset.setValue(4000, "广州", "JavaWeb");

		dataset.setValue(15000, "北京", "易用struts");
		dataset.setValue(5000, "上海", "易用struts");
		dataset.setValue(10000, "广州", "易用struts");

		dataset.setValue(20000, "北京", "精通JSF");
		dataset.setValue(10000, "上海", "精通JSF");
		dataset.setValue(10000, "广州", "精通JSF");
		// 生成图表
		JFreeChart chart = createBarChart(dataset, "柱状图", "书名", "销售数量", false);
		// 生成图片
		drawToOutputStream("D:\\柱状图.JPG", chart,
				640, 480);
	}

	public static void 测试饼图() {
		// 初始化数据
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue(" 市场前期", new Double(10));
		dataset.setValue(" 立项", new Double(15));
		dataset.setValue(" 计划", new Double(10));
		dataset.setValue(" 需求与设计", new Double(10));
		dataset.setValue(" 执行控制", new Double(35));
		dataset.setValue(" 收尾", new Double(10));
		dataset.setValue(" 运维", new Double(10));
		// 生成图表
		JFreeChart chart = createPieChart(dataset, "饼图", true);
		// 生成图片
		drawToOutputStream("D:\\饼图.JPG", chart,
				640, 480);
	}

	public static void 测试曲线图_MONTH() {
		// 初始化数据
		String chartTitle = "访问量统计图形";
		String chartSeriesDesc = "月访问量曲线";
		String chartXdesc = "时间";
		String chartYdesc = "访问量";
		String timeFormat = "MM";// yyyy-MM-dd
		String periodType = "MONTH";
		int dateInterval = 1;
		TimeSeriesCollection dataset = new TimeSeriesCollection();
		TimeSeries monthseries = new TimeSeries(chartSeriesDesc, Month.class);
		monthseries.add(new Month(1, 2001), 100);
		monthseries.add(new Month(2, 2001), 120);
		monthseries.add(new Month(3, 2001), 70);
		monthseries.add(new Month(4, 2001), 680);
		monthseries.add(new Month(5, 2001), 345);
		monthseries.add(new Month(6, 2001), 430);
		monthseries.add(new Month(7, 2001), 300);
		monthseries.add(new Month(8, 2001), 200);
		monthseries.add(new Month(9, 2001), 190);
		monthseries.add(new Month(10, 2001), 300);
		monthseries.add(new Month(11, 2001), 200);
		monthseries.add(new Month(12, 2001), 240);
		// 存储至集合对象中
		dataset.addSeries(monthseries);
		// 生成图表
		JFreeChart chart = createLineChart(chartTitle, chartXdesc, chartYdesc,
				periodType, dateInterval, timeFormat, dataset);
		// 生成图片
		drawToOutputStream("D:\\曲线-月.JPG", chart, 640, 480);
	}

	public static void 测试曲线图_DAY() {
		// 初始化数据
		String chartTitle = "访问量统计图形";
		String chartSeriesDesc = "日访问量曲线";
		String chartXdesc = "时间";
		String chartYdesc = "访问量";
		String timeFormat = "dd";// yyyy-MM-dd
		String periodType = "DAY";
		int dateInterval = 1;
		TimeSeriesCollection dataset = new TimeSeriesCollection();
		TimeSeries dayseries = new TimeSeries(chartSeriesDesc, Day.class);
		dayseries.add(new Day(1, 1, 2010), 100);
		dayseries.add(new Day(2, 1, 2010), 200);
		dayseries.add(new Day(4, 1, 2010), 400);
		dayseries.add(new Day(5, 1, 2010), 600);
		dayseries.add(new Day(7, 1, 2010), 200);
		dayseries.add(new Day(8, 1, 2010), 400);
		dayseries.add(new Day(12, 1, 2010), 300);
		dayseries.add(new Day(23, 1, 2010), 500);
		dayseries.add(new Day(29, 1, 2010), 300);
		// 存储至集合对象中
		dataset.addSeries(dayseries);
		// 生成图表
		JFreeChart chart = createLineChart(chartTitle, chartXdesc, chartYdesc,
				periodType, dateInterval, timeFormat, dataset);
		// 生成图片
		drawToOutputStream("D:\\曲线-天.JPG", chart, 640, 480);
	}

	public static void 测试曲线图_HOUR() {
		// 初始化数据
		String chartTitle = "访问量统计图形";
		String chartSeriesDesc = "小时访问量曲线";
		String chartXdesc = "时间";
		String chartYdesc = "访问量";
		String timeFormat = "hh";// yyyy-MM-dd
		String periodType = "HOUR";
		int dateInterval = 1;
		TimeSeriesCollection dataset = new TimeSeriesCollection();
		TimeSeries hourseries = new TimeSeries(chartSeriesDesc, Hour.class);
		hourseries.add(new Hour(1, 1, 1, 2010), 100);
		hourseries.add(new Hour(2, 1, 1, 2010), 200);
		hourseries.add(new Hour(3, 1, 1, 2010), 400);
		hourseries.add(new Hour(4, 1, 1, 2010), 600);
		hourseries.add(new Hour(5, 1, 1, 2010), 200);
		hourseries.add(new Hour(6, 1, 1, 2010), 400);
		hourseries.add(new Hour(7, 1, 1, 2010), 300);
		hourseries.add(new Hour(8, 1, 1, 2010), 500);
		hourseries.add(new Hour(9, 1, 1, 2010), 300);
		// 存储至集合对象中
		dataset.addSeries(hourseries);
		// 生成图表
		JFreeChart chart = createLineChart(chartTitle, chartXdesc, chartYdesc,
				periodType, dateInterval, timeFormat, dataset);
		// 生成图片
		drawToOutputStream("D:\\曲线-小时.JPG", chart, 640, 480);
	}

	public static void main(String[] args) {
		测试饼图();
		 测试柱状图();
		// 测试曲线图_MONTH();
		// 测试曲线图_DAY();
		// 测试曲线图_HOUR();
	}

}
package table;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;

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.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.labels.StandardPieToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer;
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;
import org.jfree.data.time.Day;
import org.jfree.data.time.Hour;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.util.Rotation;

public class JFreeUtils {
	public static JFreeChart createPieChart(DefaultPieDataset dataset,
			String title, boolean is3D) {
		JFreeChart chart = null;
		if (is3D) {
			chart = ChartFactory.createPieChart3D(title, // 图表标题
					dataset, // 数据集
					true, // 是否显示图例
					true, // 是否显示工具提示
					true // 是否生成URL
					);
		} else {
			chart = ChartFactory.createPieChart(title, // 图表标题
					dataset, // 数据集
					true, // 是否显示图例
					true, // 是否显示工具提示
					true // 是否生成URL
					);
		}
		// 设置标题字体==为了防止中文乱码:必须设置字体
		chart.setTitle(new TextTitle(title, new Font("黑体", Font.ITALIC, 22)));
		// 设置图例的字体==为了防止中文乱码:必须设置字体
		chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 12));
		// 获取饼图的Plot对象(实际图表)
		PiePlot plot = (PiePlot) chart.getPlot();
		// 图形边框颜色
		plot.setBaseSectionOutlinePaint(Color.GRAY);
		// 图形边框粗细
		plot.setBaseSectionOutlineStroke(new BasicStroke(0.0f));
		// 设置饼状图的绘制方向,可以按顺时针方向绘制,也可以按逆时针方向绘制
		plot.setDirection(Rotation.ANTICLOCKWISE);
		// 设置绘制角度(图形旋转角度)
		plot.setStartAngle(70);
		// 设置突出显示的数据块
		// plot.setExplodePercent("One", 0.1D);
		// 设置背景色透明度
		plot.setBackgroundAlpha(0.7F);
		// 设置前景色透明度
		plot.setForegroundAlpha(0.65F);
		// 设置区块标签的字体==为了防止中文乱码:必须设置字体
		plot.setLabelFont(new Font("宋体", Font.PLAIN, 12));
		// 扇区分离显示,对3D图不起效
		if (is3D)
			plot.setExplodePercent(dataset.getKey(3), 0.1D);
		// 图例显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
		plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
				"{0}:{1}\r\n({2})", NumberFormat.getNumberInstance(),
				new DecimalFormat("0.00%")));
		// 图例显示百分比
		// plot.setLegendLabelGenerator(new
		// StandardPieSectionLabelGenerator("{0}={1}({2})"));
		// 指定显示的饼图为:圆形(true) 还是椭圆形(false)
		plot.setCircular(true);
		// 没有数据的时候显示的内容
		plot.setNoDataMessage("找不到可用数据...");
		// 设置鼠标悬停提示
		plot.setToolTipGenerator(new StandardPieToolTipGenerator());
		// 设置热点链接
		// plot.setURLGenerator(new StandardPieURLGenerator("detail.jsp"));

		return chart;
	}

	public static JFreeChart createBarChart(CategoryDataset dataset,
			String title, String x, String y, boolean is3D) {
		JFreeChart chart = null;
		if (is3D) {
			chart = ChartFactory.createBarChart3D( // 3D柱状图
					// JFreeChart chart = ChartFactory.createLineChart3D(
					// //3D折线图
					title, // 图表的标题
					x, // 目录轴的显示标签
					y, // 数值轴的显示标签
					dataset, // 数据集
					PlotOrientation.VERTICAL, // 图表方式:V垂直;H水平
					true, // 是否显示图例
					false, // 是否显示工具提示
					false // 是否生成URL
					);
		} else {
			chart = ChartFactory.createBarChart( // 柱状图
					// JFreeChart chart = ChartFactory.createLineChart3D(
					// //3D折线图
					title, // 图表的标题
					x, // 目录轴的显示标签
					y, // 数值轴的显示标签
					dataset, // 数据集
					PlotOrientation.VERTICAL, // 图表方式:V垂直;H水平
					true, // 是否显示图例
					false, // 是否显示工具提示
					false // 是否生成URL
					);
		}

		// ===============为了防止中文乱码:必须设置字体
		chart.setTitle(new TextTitle(title, new Font("黑体", Font.ITALIC, 22)));

		LegendTitle legend = chart.getLegend(); // 获取图例
		legend.setItemFont(new Font("宋体", Font.BOLD, 12)); // 设置图例的字体,防止中文乱码

		CategoryPlot plot = (CategoryPlot) chart.getPlot(); // 获取柱图的Plot对象(实际图表)
		// 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确)
		plot.setBackgroundPaint(new Color(255, 255, 204));
		plot.setForegroundAlpha(0.65F); // 设置前景色透明度

		// 设置横虚线可见
		plot.setRangeGridlinesVisible(true);
		// 虚线色彩
		plot.setRangeGridlinePaint(Color.gray);

		CategoryAxis h = plot.getDomainAxis(); // 获取x轴
		h.setMaximumCategoryLabelWidthRatio(1.0f);// 横轴上的 Lable 是否完整显示
		h.setLabelFont(new Font("宋体", Font.BOLD, 12));// 设置字体,防止中文乱码
		h.setTickLabelFont(new Font("宋体", Font.BOLD, 12));// 轴数值
		// h.setCategoryLabelPositions(CategoryLabelPositions.UP_45);//45度倾斜

		plot.getRangeAxis().setLabelFont(new Font("宋体", Font.BOLD, 12)); // Y轴设置字体,防止中文乱码

		// 柱图的呈现器
		BarRenderer renderer = new BarRenderer();
		// 设置柱子宽度
		// renderer.setMaximumBarWidth(0.05);
		// 设置柱子高度
		// renderer.setMinimumBarLength(0.2);
		// 设置柱子边框颜色
		renderer.setBaseOutlinePaint(Color.BLACK);
		// 设置柱子边框可见
		renderer.setDrawBarOutline(true);
		// 设置每个柱的颜色
		renderer.setSeriesPaint(0, Color.BLUE);
		renderer.setSeriesPaint(1, Color.GREEN);
		renderer.setSeriesPaint(2, Color.RED);
		// 设置每个地区所包含的平行柱的之间距离
		renderer.setItemMargin(0.05);
		// 显示每个柱的数值,并修改该数值的字体属性
		renderer.setIncludeBaseInRange(true);
		renderer
				.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer.setBaseItemLabelsVisible(true);
		// 设置柱的透明度
		plot.setForegroundAlpha(1.0f);
		// 给柱图添加呈现器
		plot.setRenderer(renderer);

		// 没有数据的时候显示的内容
		plot.setNoDataMessage("找不到可用数据...");

		return chart;
	}

	public static JFreeChart createLineChart(String chartTitle,
			String chartXdesc, String chartYdesc, String periodType,
			int dateInterval, String timeFormat, XYDataset dataSet) {
		JFreeChart chart = ChartFactory.createTimeSeriesChart(chartTitle,
				chartXdesc, chartYdesc, dataSet, true, false, false);
		// 设置标题
		chart.setTitle(new TextTitle(chartTitle,
				new Font("黑体", Font.ITALIC, 22)));
		LegendTitle legend = chart.getLegend();
		legend.setItemFont(new Font("宋体", Font.BOLD, 12)); // 设置图例的字体,防止中文乱码
		XYPlot xyplot = (XYPlot) chart.getXYPlot();
		xyplot.setBackgroundPaint(new Color(255, 255, 204));
		xyplot.setForegroundAlpha(0.65F); // 设置前景色透明度
		// 设置横虚线可见
		xyplot.setRangeGridlinesVisible(true);
		// 虚线色彩
		xyplot.setRangeGridlinePaint(Color.gray);
		xyplot.getRangeAxis().setLabelFont(new Font("宋体", Font.BOLD, 12)); // Y轴设置字体,防止中文乱码
		xyplot.getDomainAxis().setLabelFont(new Font("宋体", Font.BOLD, 12)); // X轴设置字体,防止中文乱码

		DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis();

		if (periodType.equalsIgnoreCase("MONTH")) {
			dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH,
					dateInterval));
		} else if (periodType.equalsIgnoreCase("DAY")) {
			dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,
					dateInterval));
		} else if (periodType.equalsIgnoreCase("HOUR")) {
			dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.HOUR,
					dateInterval));
		}
		dateaxis.setDateFormatOverride(new SimpleDateFormat(timeFormat));
		return chart;
	}

	private static boolean drawToOutputStream(String destPath,
			JFreeChart chart, int width, int heigth) {
		FileOutputStream fos = null;
		boolean returnValue = true;
		try {
			fos = new FileOutputStream(destPath);
			ChartUtilities.writeChartAsPNG(fos, // 指定目标输出流
					chart, // 图表对象
					width, // 宽
					heigth, // 高
					null); // ChartRenderingInfo信息
		} catch (IOException e) {
			e.printStackTrace();
			returnValue = false;
		} finally {
			try {
				fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
		return returnValue;
	}

	public static void 测试柱状图() {
		// 初始化数据
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.setValue(5000, "北京", "Corejava");
		dataset.setValue(3000, "上海", "Corejava");
		dataset.setValue(2000, "广州", "Corejava");

		dataset.setValue(10000, "北京", "JavaWeb");
		dataset.setValue(6000, "上海", "JavaWeb");
		dataset.setValue(4000, "广州", "JavaWeb");

		dataset.setValue(15000, "北京", "易用struts");
		dataset.setValue(5000, "上海", "易用struts");
		dataset.setValue(10000, "广州", "易用struts");

		dataset.setValue(20000, "北京", "精通JSF");
		dataset.setValue(10000, "上海", "精通JSF");
		dataset.setValue(10000, "广州", "精通JSF");
		// 生成图表
		JFreeChart chart = createBarChart(dataset, "柱状图", "书名", "销售数量", false);
		// 生成图片
		drawToOutputStream("D:\\柱状图.JPG", chart,
				640, 480);
	}

	public static void 测试饼图() {
		// 初始化数据
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue(" 市场前期", new Double(10));
		dataset.setValue(" 立项", new Double(15));
		dataset.setValue(" 计划", new Double(10));
		dataset.setValue(" 需求与设计", new Double(10));
		dataset.setValue(" 执行控制", new Double(35));
		dataset.setValue(" 收尾", new Double(10));
		dataset.setValue(" 运维", new Double(10));
		// 生成图表
		JFreeChart chart = createPieChart(dataset, "饼图", true);
		// 生成图片
		drawToOutputStream("D:\\饼图.JPG", chart,
				640, 480);
	}

	public static void 测试曲线图_MONTH() {
		// 初始化数据
		String chartTitle = "访问量统计图形";
		String chartSeriesDesc = "月访问量曲线";
		String chartXdesc = "时间";
		String chartYdesc = "访问量";
		String timeFormat = "MM";// yyyy-MM-dd
		String periodType = "MONTH";
		int dateInterval = 1;
		TimeSeriesCollection dataset = new TimeSeriesCollection();
		TimeSeries monthseries = new TimeSeries(chartSeriesDesc, Month.class);
		monthseries.add(new Month(1, 2001), 100);
		monthseries.add(new Month(2, 2001), 120);
		monthseries.add(new Month(3, 2001), 70);
		monthseries.add(new Month(4, 2001), 680);
		monthseries.add(new Month(5, 2001), 345);
		monthseries.add(new Month(6, 2001), 430);
		monthseries.add(new Month(7, 2001), 300);
		monthseries.add(new Month(8, 2001), 200);
		monthseries.add(new Month(9, 2001), 190);
		monthseries.add(new Month(10, 2001), 300);
		monthseries.add(new Month(11, 2001), 200);
		monthseries.add(new Month(12, 2001), 240);
		// 存储至集合对象中
		dataset.addSeries(monthseries);
		// 生成图表
		JFreeChart chart = createLineChart(chartTitle, chartXdesc, chartYdesc,
				periodType, dateInterval, timeFormat, dataset);
		// 生成图片
		drawToOutputStream("D:\\曲线-月.JPG", chart, 640, 480);
	}

	public static void 测试曲线图_DAY() {
		// 初始化数据
		String chartTitle = "访问量统计图形";
		String chartSeriesDesc = "日访问量曲线";
		String chartXdesc = "时间";
		String chartYdesc = "访问量";
		String timeFormat = "dd";// yyyy-MM-dd
		String periodType = "DAY";
		int dateInterval = 1;
		TimeSeriesCollection dataset = new TimeSeriesCollection();
		TimeSeries dayseries = new TimeSeries(chartSeriesDesc, Day.class);
		dayseries.add(new Day(1, 1, 2010), 100);
		dayseries.add(new Day(2, 1, 2010), 200);
		dayseries.add(new Day(4, 1, 2010), 400);
		dayseries.add(new Day(5, 1, 2010), 600);
		dayseries.add(new Day(7, 1, 2010), 200);
		dayseries.add(new Day(8, 1, 2010), 400);
		dayseries.add(new Day(12, 1, 2010), 300);
		dayseries.add(new Day(23, 1, 2010), 500);
		dayseries.add(new Day(29, 1, 2010), 300);
		// 存储至集合对象中
		dataset.addSeries(dayseries);
		// 生成图表
		JFreeChart chart = createLineChart(chartTitle, chartXdesc, chartYdesc,
				periodType, dateInterval, timeFormat, dataset);
		// 生成图片
		drawToOutputStream("D:\\曲线-天.JPG", chart, 640, 480);
	}

	public static void 测试曲线图_HOUR() {
		// 初始化数据
		String chartTitle = "访问量统计图形";
		String chartSeriesDesc = "小时访问量曲线";
		String chartXdesc = "时间";
		String chartYdesc = "访问量";
		String timeFormat = "hh";// yyyy-MM-dd
		String periodType = "HOUR";
		int dateInterval = 1;
		TimeSeriesCollection dataset = new TimeSeriesCollection();
		TimeSeries hourseries = new TimeSeries(chartSeriesDesc, Hour.class);
		hourseries.add(new Hour(1, 1, 1, 2010), 100);
		hourseries.add(new Hour(2, 1, 1, 2010), 200);
		hourseries.add(new Hour(3, 1, 1, 2010), 400);
		hourseries.add(new Hour(4, 1, 1, 2010), 600);
		hourseries.add(new Hour(5, 1, 1, 2010), 200);
		hourseries.add(new Hour(6, 1, 1, 2010), 400);
		hourseries.add(new Hour(7, 1, 1, 2010), 300);
		hourseries.add(new Hour(8, 1, 1, 2010), 500);
		hourseries.add(new Hour(9, 1, 1, 2010), 300);
		// 存储至集合对象中
		dataset.addSeries(hourseries);
		// 生成图表
		JFreeChart chart = createLineChart(chartTitle, chartXdesc, chartYdesc,
				periodType, dateInterval, timeFormat, dataset);
		// 生成图片
		drawToOutputStream("D:\\曲线-小时.JPG", chart, 640, 480);
	}

	public static void main(String[] args) {
		测试饼图();
		 测试柱状图();
		// 测试曲线图_MONTH();
		// 测试曲线图_DAY();
		// 测试曲线图_HOUR();
	}

}