series, String[] categories) {
+ // 1:创建数据集合
+ // 调用ChartUtils的createDefaultCategoryDataset方法,根据传入的数据系列和类别创建一个默认的类别数据集
+ DefaultCategoryDataset dataset = ChartUtils
+ .createDefaultCategoryDataset(series, categories);
+ // 使用JFreeChart的工厂方法创建一个堆积柱状图,传入标题、x轴标题、y轴标题和数据集
+ JFreeChart chart = org.jfree.chart.ChartFactory.createStackedBarChart(
+ title, domainAxisLabel, rangeAxisLabel, dataset);
+ // 3:设置抗锯齿,防止字体显示不清楚
+ // 调用ChartUtils的setAntiAlias方法,为图表设置抗锯齿,使字体等显示更清晰
+ ChartUtils.setAntiAlias(chart);// 抗锯齿
+ // 4:对柱子进行渲染[创建不同图形]
+ // 调用ChartUtils的setStackBarRender方法,对堆积柱状图的绘图区域进行渲染
+ ChartUtils.setStackBarRender(chart.getCategoryPlot());
+ // 5:对其他部分进行渲染
+ // 调用ChartUtils的setXAixs方法,对图表的X坐标轴进行渲染
+ ChartUtils.setXAixs(chart.getCategoryPlot());// X坐标轴渲染
+ // 调用ChartUtils的setYAixs方法,对图表的Y坐标轴进行渲染
+ ChartUtils.setYAixs(chart.getCategoryPlot());// Y坐标轴渲染
+ // 设置标注无边框
+ // 创建一个白色边框的BlockBorder对象,并将其设置为图表图例的边框
+ chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
+ // 返回创建并渲染好的堆积柱状图
+ return chart;
+ }
+}
+package com.utils;
+// 声明该类所在的包名为com.utils
+
+import org.jfree.chart.ChartFactory;
+// 导入JFreeChart库中的图表工厂类,用于创建各种类型的图表
+
+import org.jfree.chart.JFreeChart;
+// 导入JFreeChart类,它是JFreeChart库中表示图表的核心类
+
+import org.jfree.chart.StandardChartTheme;
+// 导入标准图表主题类,用于设置图表的外观主题
+
+import org.jfree.chart.axis.DateAxis;
+// 导入日期轴类,用于在图表中显示日期
+
+import org.jfree.chart.axis.DateTickUnit;
+// 导入日期刻度单位类,用于定义日期轴上的刻度间隔
+
+import org.jfree.chart.axis.DateTickUnitType;
+// 导入日期刻度单位类型枚举类,用于指定日期刻度的类型(如年、月、日等)
+
+import org.jfree.chart.axis.ValueAxis;
+// 导入值轴类,用于表示图表中的数值轴
+
+import org.jfree.chart.block.BlockBorder;
+// 导入块边框类,用于设置图表中块(如图例)的边框
+
+import org.jfree.chart.labels.*;
+// 导入JFreeChart中用于标签相关的类的包,用于设置图表的标签显示等
+
+import org.jfree.chart.plot.*;
+// 导入JFreeChart中用于绘图区域相关的类的包,用于处理图表的绘图区域设置
+
+import org.jfree.chart.renderer.category.BarRenderer;
+// 导入柱状图渲染器类,用于渲染柱状图
+
+import org.jfree.chart.renderer.category.LineAndShapeRenderer;
+// 导入折线图和形状渲染器类,用于渲染折线图和数据点的形状
+
+import org.jfree.chart.renderer.category.StackedBarRenderer;
+// 导入堆积柱状图渲染器类,用于渲染堆积柱状图
+
+import org.jfree.chart.renderer.category.StandardBarPainter;
+// 导入标准柱状图绘制器类,用于绘制柱状图的外观
+
+import org.jfree.chart.renderer.xy.StandardXYBarPainter;
+// 导入标准XY柱状图绘制器类,用于绘制XY图表中的柱状图外观
+
+import org.jfree.chart.renderer.xy.XYBarRenderer;
+// 导入XY柱状图渲染器类,用于渲染XY图表中的柱状图
+
+import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
+// 导入XY折线图和形状渲染器类,用于渲染XY图表中的折线图和数据点的形状
+
+import org.jfree.data.category.DefaultCategoryDataset;
+// 导入默认的类别数据集类,用于处理柱状图、折线图等类别数据的数据集
+
+import org.jfree.data.general.DefaultPieDataset;
+// 导入默认的饼图数据集类,用于处理饼图的数据集
+
+import org.jfree.data.time.Day;
+// 导入表示一天的时间类,用于时间序列数据
+
+import org.jfree.data.time.TimeSeries;
+// 导入时间序列类,用于处理时间序列数据
+
+import org.jfree.ui.RectangleInsets;
+// 导入矩形边距类,用于设置图表中元素的边距
+
+import org.jfree.ui.TextAnchor;
+// 导入文本锚点类,用于指定文本的位置
+
+import java.awt.*;
+// 导入java.awt包,包含用于处理图形和用户界面的类
+
+import java.text.DecimalFormat;
+// 导入十进制格式化类,用于格式化数字
+
+import java.text.NumberFormat;
+// 导入数字格式化类,用于格式化数字
+
+import java.text.ParseException;
+// 导入解析异常类,用于处理日期等解析时可能抛出的异常
+
+import java.text.SimpleDateFormat;
+// 导入简单日期格式化类,用于格式化日期
+
+import java.util.Date;
+// 导入日期类,用于表示日期和时间
+
+import java.util.Vector;
+// 导入Vector类,它是一个动态数组,用于存储数据系列等
+
+/**
+ * Jfreechart工具类
+ *
+ * 解决中文乱码问题
+ * 用来创建类别图表数据集、创建饼图数据集、时间序列图数据集
+ * 用来对柱状图、折线图、饼图、堆积柱状图、时间序列图的样式进行渲染
+ * 设置X-Y坐标轴样式
+ *
+ *
+ *
+ * @author chenchangwen
+ * @since:2014-2-18
+ *
+ */
+public class ChartUtils {
+ // 定义一个静态字符串,用于表示无数据时的提示信息
+ private static String NO_DATA_MSG = "暂无数据";
+ // 定义一个静态字体对象,设置字体为宋体,样式为普通,大小为12
+ private static Font FONT = new Font("宋体", Font.PLAIN, 12);
+ // 定义一个静态颜色数组,包含多种颜色,用于图表的颜色设置
+ public static Color[] CHART_COLORS = { new Color(31, 129, 188),
+ new Color(92, 92, 97), new Color(144, 237, 125),
+ new Color(255, 188, 117), new Color(153, 158, 255),
+ new Color(255, 117, 153), new Color(253, 236, 109),
+ new Color(128, 133, 232), new Color(158, 90, 102),
+ new Color(255, 204, 102) };
+
+ // 静态代码块,在类加载时执行,用于设置图表主题
+ static {
+ setChartTheme();
+ }
+
+ // 空的构造函数
+ public ChartUtils() {
+ }
+
+ /**
+ * 中文主题样式 解决乱码
+ */
+ public static void setChartTheme() {
+ // 创建一个标准图表主题对象,命名为"CN"
+ StandardChartTheme chartTheme = new StandardChartTheme("CN");
+ // 设置标题字体为之前定义的字体
+ chartTheme.setExtraLargeFont(FONT);
+ // 设置图例的字体为之前定义的字体
+ chartTheme.setRegularFont(FONT);
+ // 设置轴向的字体为之前定义的字体
+ chartTheme.setLargeFont(FONT);
+ chartTheme.setSmallFont(FONT);
+ // 设置标题的颜色为灰色
+ chartTheme.setTitlePaint(new Color(51, 51, 51));
+ // 设置副标题的颜色为深灰色
+ chartTheme.setSubtitlePaint(new Color(85, 85, 85));
+
+ // 设置图例的背景颜色为白色
+ chartTheme.setLegendBackgroundPaint(Color.WHITE);
+ // 设置图例项的颜色为黑色
+ chartTheme.setLegendItemPaint(Color.BLACK);
+ // 设置图表的背景颜色为白色
+ chartTheme.setChartBackgroundPaint(Color.WHITE);
+ // 绘制颜色绘制颜色.轮廓供应商
+ // paintSequence,outlinePaintSequence,strokeSequence,outlineStrokeSequence,shapeSequence
+
+ // 定义轮廓颜色数组,这里只有白色
+ Paint[] OUTLINE_PAINT_SEQUENCE = new Paint[] { Color.WHITE };
+ // 创建一个默认的绘图供应商,设置颜色、轮廓颜色等
+ DefaultDrawingSupplier drawingSupplier = new DefaultDrawingSupplier(
+ CHART_COLORS, CHART_COLORS, OUTLINE_PAINT_SEQUENCE,
+ DefaultDrawingSupplier.DEFAULT_STROKE_SEQUENCE,
+ DefaultDrawingSupplier.DEFAULT_OUTLINE_STROKE_SEQUENCE,
+ DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE);
+ // 设置图表主题的绘图供应商
+ chartTheme.setDrawingSupplier(drawingSupplier);
+
+ // 设置绘图区域的背景颜色为白色
+ chartTheme.setPlotBackgroundPaint(Color.WHITE);
+ // 设置绘图区域外边框的颜色为白色
+ chartTheme.setPlotOutlinePaint(Color.WHITE);
+ // 设置链接标签的颜色
+ chartTheme.setLabelLinkPaint(new Color(8, 55, 114));
+ // 设置标签链接的样式为三次曲线
+ chartTheme.setLabelLinkStyle(PieLabelLinkStyle.CUBIC_CURVE);
+
+ // 设置图表的边距
+ chartTheme.setAxisOffset(new RectangleInsets(5, 12, 5, 12));
+ // 设置X坐标轴垂直网格的颜色
+ chartTheme.setDomainGridlinePaint(new Color(192, 208, 224));
+ // 设置Y坐标轴水平网格的颜色
+ chartTheme.setRangeGridlinePaint(new Color(192, 192, 192));
+
+ // 设置基线的颜色为白色
+ chartTheme.setBaselinePaint(Color.WHITE);
+ // 设置十字准线的颜色为蓝色
+ chartTheme.setCrosshairPaint(Color.BLUE);
+ // 设置坐标轴标题文字的颜色
+ chartTheme.setAxisLabelPaint(new Color(51, 51, 51));
+ // 设置刻度数字的颜色
+ chartTheme.setTickLabelPaint(new Color(67, 67, 72));
+ // 设置柱状图的渲染器为标准柱状图绘制器
+ chartTheme.setBarPainter(new StandardBarPainter());
+ // 设置XYBar的渲染器为标准XYBar绘制器
+ chartTheme.setXYBarPainter(new StandardXYBarPainter());
+
+ // 设置项目标签的颜色为黑色
+ chartTheme.setItemLabelPaint(Color.black);
+ // 设置温度计的颜色为白色
+ chartTheme.setThermometerPaint(Color.white);
+
+ // 设置JFreeChart的全局图表主题
+ ChartFactory.setChartTheme(chartTheme);
+ }
+
+ /**
+ * 必须设置文本抗锯齿
+ */
+ public static void setAntiAlias(JFreeChart chart) {
+ // 设置图表的文本抗锯齿为关闭状态
+ chart.setTextAntiAlias(false);
+ }
+
+ /**
+ * 设置图例无边框,默认黑色边框
+ */
+ public static void setLegendEmptyBorder(JFreeChart chart) {
+ // 创建一个白色边框的BlockBorder对象,并将其设置为图表图例的边框
+ chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
+ }
+
+ /**
+ * 创建类别数据集合
+ */
+ public static DefaultCategoryDataset createDefaultCategoryDataset(
+ Vector series, String[] categories) {
+ // 创建一个默认的类别数据集对象
+ DefaultCategoryDataset dataset = new DefaultCategoryDataset();
+
+ // 遍历数据系列
+ for (Serie serie : series) {
+ // 获取数据系列的名称
+ String name = serie.getName();
+ // 获取数据系列的数据
+ Vector