java Jfree,文件中代码检测: 完成每周记录,并实现折线图和饼状图

先需要导入两个包: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 + "行");
    }
}

这里写图片描述
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值