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;
}
-}
+}
\ No newline at end of file
diff --git a/src/com/utils/ChartUtils.java b/src/com/utils/ChartUtils.java
index 14518f4..05d8c76 100644
--- a/src/com/utils/ChartUtils.java
+++ b/src/com/utils/ChartUtils.java
@@ -1,36 +1,95 @@
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工具类
@@ -40,26 +99,31 @@ import java.util.Vector;
* 用来对柱状图、折线图、饼图、堆积柱状图、时间序列图的样式进行渲染
* 设置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) };// 颜色
+ new Color(255, 204, 102) };
+ // 静态代码块,在类加载时执行,用于设置图表主题
static {
setChartTheme();
}
+ // 空的构造函数
public ChartUtils() {
}
@@ -67,52 +131,75 @@ public class 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.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.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));
- chartTheme.setDomainGridlinePaint(new Color(192, 208, 224));// X坐标轴垂直网格颜色
- chartTheme.setRangeGridlinePaint(new Color(192, 192, 192));// Y坐标轴水平网格颜色
+ // 设置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());// 设置柱状图渲染
- chartTheme.setXYBarPainter(new StandardXYBarPainter());// XYBar 渲染
-
+ // 设置十字准线的颜色为蓝色
+ 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);// 温度计
+ // 设置温度计的颜色为白色
+ chartTheme.setThermometerPaint(Color.white);
+ // 设置JFreeChart的全局图表主题
ChartFactory.setChartTheme(chartTheme);
}
@@ -120,16 +207,16 @@ public class ChartUtils {
* 必须设置文本抗锯齿
*/
public static void setAntiAlias(JFreeChart chart) {
+ // 设置图表的文本抗锯齿为关闭状态
chart.setTextAntiAlias(false);
-
}
/**
* 设置图例无边框,默认黑色边框
*/
public static void setLegendEmptyBorder(JFreeChart chart) {
+ // 创建一个白色边框的BlockBorder对象,并将其设置为图表图例的边框
chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
-
}
/**
@@ -137,29 +224,39 @@ public class ChartUtils {
*/
public static DefaultCategoryDataset createDefaultCategoryDataset(
Vector series, String[] categories) {
+ // 创建一个默认的类别数据集对象
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
+ // 遍历数据系列
for (Serie serie : series) {
+ // 获取数据系列的名称
String name = serie.getName();
+ // 获取数据系列的数据
Vector