先需要导入两个包:jreechar-1.0.13 jcommon1.0.16
下载地址:https://cn.jarfire.org/jcommon.html
https://cn.jarfire.org/jfreechart.html
代码:
package com.oracle.test.Jfree;
import java.awt.Color;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.AxisSpace;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardXYItemLabelGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.time.Year;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.TextAnchor;
public class CodeCounterGrow {
static int count = 0;
static List<Long> list = new ArrayList<>();
static List<Integer> gettime = new ArrayList<>();
static String str = "20160808";
static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
static Long time;
static int num = 0;
public static void sum() {
try {
time = sdf.parse(str).getTime();
} catch (Exception e) {
// TODO: handle exception
}
list.add(time);
for (; time < System.currentTimeMillis(); num++) {
time += 7 * 24 * 60 * 60 * 1000;
list.add(time);
gettime.add(0);
}
}
public static void checkAll(File file) {
if (file.isFile()) {
if (file.getName().endsWith(".java")) {// 如果是文件再判断是不是java文件
long ltime = file.lastModified();// 返回文件最后修改时间,是以个long型毫秒数
try (BufferedReader br = new BufferedReader(
new FileReader(file));) {
for (int i = 0; i < num; i++) {// 了解到try,catch居然会影响for!
if (ltime < list.get(i + 1)) {
String str = null;
while ((str = br.readLine()) != null) {// 查询整行代码,用readLine换行处理
if (!str.trim().equals(""))// 去掉无代码的空行
{
gettime.set(i, gettime.get(i) + 1);
count++;
}
}
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(" " + file.getName());
}
} else if (file.isDirectory()) {
File[] files = file.listFiles();// 如果是目录,就遍历目录下的所以目录或文件
for (File f : files) {
checkAll(f);
// System.out.println(f.getName());
}
}
}
public static void outPut(File file) {
sum();
checkAll(file);
int he = 0;
for (int a : gettime) {
he += a;
}
he /= num;
System.out.println("每周写代码情况:");
for (int i = 0; i < num; i++) {
String stime = new SimpleDateFormat("yyyy-MM-dd")
.format(new Date(list.get(i)));
String etime = new SimpleDateFormat("yyyy-MM-dd")
.format(new Date(list.get(i + 1) - 1));
System.out.print("第" + (i + 1) + "周:" + " 从" + stime + "到" + etime
+ "时间里,写了 " + gettime.get(i) + "行java代码 ");
if (gettime.get(i) > he) {
System.out.println("超过周平均水平");
} else {
System.out.println("低于周平均水平");
}
}
draw();
outPut2();
}
public static void draw() {
// 首先构造数据
@SuppressWarnings("deprecation")
TimeSeries timeSeries = new TimeSeries("java代码量", Year.class);
// 时间曲线数据集合
TimeSeriesCollection lineDataset = new TimeSeriesCollection();
// 构造数据集合
for (int i = 0; i < num; i++) {
timeSeries.add(new Year(i + 1), gettime.get(i));
}
lineDataset.addSeries(timeSeries);
JFreeChart chart = ChartFactory.createTimeSeriesChart("", "date", "num",
lineDataset, true, true, true);
// 增加标题
chart.setTitle(
new TextTitle("周代码变化量", new Font("隶书", Font.ITALIC, 20)));
chart.setAntiAlias(true);
XYPlot plot = (XYPlot) chart.getPlot();
plot.setAxisOffset(new RectangleInsets(10, 10, 10, 10));// 图片区与坐标轴的距离
plot.setOutlinePaint(Color.PINK);
plot.setInsets(new RectangleInsets(15, 15, 15, 15));// 坐标轴与最外延的距离
// plot.setOrientation(PlotOrientation.HORIZONTAL);//图形的方向,包括坐标轴。
AxisSpace as = new AxisSpace();
as.setLeft(25);
as.setRight(25);
plot.setFixedRangeAxisSpace(as);
chart.setPadding(new RectangleInsets(5, 5, 5, 5));
chart.setNotify(true);
// 设置曲线是否显示数据点
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) plot
.getRenderer();
xylineandshaperenderer.setBaseShapesVisible(true);
// 设置曲线显示各数据点的值
XYItemRenderer xyitem = plot.getRenderer();
xyitem.setBaseItemLabelsVisible(true);
xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition(
ItemLabelAnchor.INSIDE10, TextAnchor.BASELINE_LEFT));
xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 14));
plot.setRenderer(xyitem);
// 显示
ChartFrame frame = new ChartFrame("java", chart);
frame.pack();
frame.setVisible(true);
}
public static void outPut2() {
StandardChartTheme sct = new StandardChartTheme("CN");
sct.setExtraLargeFont(new Font("隶书", Font.BOLD, 20));
sct.setRegularFont(new Font("隶书", Font.BOLD, 20));
sct.setLargeFont(new Font("隶书", Font.BOLD, 20));
DefaultPieDataset dataset = new DefaultPieDataset();
for (int i = 0; i < num; i++) {
String str = "第" + (i + 1) + "周";
dataset.setValue(str, gettime.get(i));
}
ChartFactory.setChartTheme(sct);
JFreeChart jfreechart = ChartFactory.createPieChart3D("周代码量图", dataset,
true, true, true);
ChartFrame frame = new ChartFrame("java代码量", jfreechart);
frame.setVisible(true);
frame.pack();
}
public static void main(String[] args) {
File file = new File("F:\\学习\\jgw");
outPut(file);
System.out.println("共写java代码:" + count + "行");
}
}