代码统计器

   我们平时写过很多代码,但在完成某个工程时,自己到底写了多少行代码呢?

   此代码统计器在这里就可以发挥作用了,它可以计算单个java文件的行数,
也可以计算出某个目录下所有java文件的总代码行数。

    其中不妥之外望大家多提意见!3Q

注:统计结果中不包含注释行和空格行



package test;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Rectangle;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.UIManager;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFileChooser.*;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import java.io.*;
import java.util.Vector;


public class CodeFrame extends JFrame {
    JLabel jLabel1 = new JLabel();
    JLabel jLabel2 = new JLabel();
    JTextField jTextField1 = new JTextField();
    JLabel jLabel3 = new JLabel();
    JTextField jTextField2 = new JTextField();
    JButton jButton1 = new JButton();
    JLabel jLabel4 = new JLabel();
    JScrollPane jScrollPane1 = new JScrollPane();
    JTextArea jTextArea1 = new JTextArea();
    JButton jButton2 = new JButton();
    public CodeFrame() {
        try {
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

    private void jbInit() throws Exception {
        getContentPane().setLayout(null);
        this.setBounds(0, 0, 510, 530);
        jLabel1.setFont(new java.awt.Font("宋体", Font.BOLD, 20));
        jLabel1.setText("代码统计器");
        jLabel1.setBounds(new Rectangle(181, 27, 116, 36));
        jButton1.addActionListener(new CodeFrame_jButton1_actionAdapter(this));
        jButton2.addActionListener(new CodeFrame_jButton2_actionAdapter(this));
        jButton3.setBounds(new Rectangle(256, 405, 106, 32));
        jButton3.setText("统计目录");
        jButton3.addActionListener(new CodeFrame_jButton3_actionAdapter(this));
        this.getContentPane().add(jLabel1, null);
        jButton2.setBounds(new Rectangle(111, 405, 103, 33));
        jButton2.setText("统计文件");
        jScrollPane1.setBounds(new Rectangle(51, 196, 409, 184));
        jLabel4.setForeground(UIManager.getColor("Button.disabledForeground"));
        jLabel4.setText("(如.java)");
        jLabel4.setBounds(new Rectangle(388, 91, 79, 32));
        jButton1.setBounds(new Rectangle(388, 143, 73, 28));
        jButton1.setText("选择");
        jTextField2.setBounds(new Rectangle(169, 143, 209, 29));
        jLabel3.setText("请选择文件/目录:");
        jLabel3.setBounds(new Rectangle(51, 142, 115, 30));
        jTextField1.setBounds(new Rectangle(169, 91, 210, 33));
        this.getContentPane().add(jTextField1);
        this.getContentPane().add(jTextField2);
        this.getContentPane().add(jButton1);
        this.getContentPane().add(jLabel4);
        this.getContentPane().add(jLabel2);
        this.getContentPane().add(jLabel3);
        this.getContentPane().add(jScrollPane1);
        this.getContentPane().add(jButton2);
        this.getContentPane().add(jButton3);
        jScrollPane1.getViewport().add(jTextArea1);
        jLabel2.setText("请输入文件类型:");
        jLabel2.setBounds(new Rectangle(51, 91, 107, 34));
        this.setVisible(true);

    }

    public static void main(String[] args) {
        CodeFrame codeframe = new CodeFrame();

    }


    File name;
    JButton jButton3 = new JButton();
    public void jButton1_actionPerformed(ActionEvent e) {
        JFileChooser f = new JFileChooser();
        f.setFileFilter(new FileFilter() {
            String t = jTextField1.getText();
            public boolean accept(File f) {
                return f.getName().endsWith(t);

            }

            public String getDescription() {
                return t;
            }

        });

        f.showOpenDialog(null);
        File ff = f.getSelectedFile();

        name = ff.getAbsoluteFile();
        jTextField2.setText(ff.getAbsolutePath());

    }


    //268,73,308,265,322,139,47,177,59,322,336,273,113,98=2800

    public void jButton2_actionPerformed(ActionEvent e) {
        if (name.getAbsolutePath().endsWith(".java")) {
            try {
                DataInputStream din = new DataInputStream(new FileInputStream(
                        name));
                int i = 0;
                int n1 = 0, n2 = 0, n = 0;
                ;
                int num = 0;
                String s = "";

                while (true) {
                    if ((s = din.readLine()) != null) {
                        if (s.trim().equals("") || s.trim().startsWith("//")) {

                        } else {
                            i++;
                            if (s.trim().startsWith("/*") &&
                                !s.trim().endsWith("*/")) {
                                n1 = i;
                            } else if (!s.trim().startsWith("/*") &&
                                       s.trim().endsWith("*/")) {
                                n2 = i;
                                n += n2 - n1 + 1;
                            } else if (s.trim().startsWith("/*") &&
                                       s.trim().endsWith("*/")) {
                                n1 = n2 = 0;
                                n += n2 - n1 + 1;
                            }

                        }
                    } else {
                        break;
                    }
                }
                num = i - n;

                din.close();
                String result =
                        "\n*******************代码所占行数统计结果**********************\n";
                result += "文件名:" + name.getName() + "\n";
                result += "代码行数:" + num + "\n";
                jTextArea1.setText(result);

            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

    }

    public void jButton3_actionPerformed(ActionEvent e) {
        String dir = jTextField2.getText();
        if (!dir.endsWith(".java")) {
            getFile(new File(dir));
            int sum = 0;
            for (int ii = 0; ii < v.size(); ii++) {
                File f = new File((String) v.get(ii));

                try {
                    DataInputStream din = new DataInputStream(new
                            FileInputStream(f));
                    int i = 0;
                    int n1 = 0, n2 = 0, n = 0;

                    String s = "";
                    int num = 0;
                    while (true) {
                        if ((s = din.readLine()) != null) {
                            if (s.trim().equals("") || s.trim().startsWith("//")) {

                            } else {
                                i++;
                                if (s.trim().startsWith("/*") &&
                                    !s.trim().endsWith("*/")) {
                                    n1 = i;
                                } else if (!s.trim().startsWith("/*") &&
                                           s.trim().endsWith("*/")) {
                                    n2 = i;
                                    n += n2 - n1 + 1;
                                } else if (s.trim().startsWith("/*") &&
                                           s.trim().endsWith("*/")) {
                                    n1 = n2 = 0;
                                    n += n2 - n1 + 1;
                                }

                            }
                        } else {
                            break;
                        }
                    }
                    num = i - n;

                    din.close();
                    sum += num;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }


            }
            String result =
                        "\n*******************代码所占行数统计结果**********************\n";
//                result += "文件名:" + name.getName() + "\n";
                result += "代码行数:" + sum + "\n";
                jTextArea1.setText(result);


        }
    }


    static Vector v = new Vector();
    public static void getFile(File f) {
        if (f.isFile()) {
            if (f.getName().endsWith(".java")) {
                v.add(f.getAbsolutePath());
            }

        } else {
            File[] fs = f.listFiles();
            for (int i = 0; i < fs.length; i++) {
                getFile(fs[i]);
            }
        }
    }

}


class CodeFrame_jButton3_actionAdapter implements ActionListener {
    private CodeFrame adaptee;
    CodeFrame_jButton3_actionAdapter(CodeFrame adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e) {
        adaptee.jButton3_actionPerformed(e);
    }
}


class CodeFrame_jButton2_actionAdapter implements ActionListener {
    private CodeFrame adaptee;
    CodeFrame_jButton2_actionAdapter(CodeFrame adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e) {
        adaptee.jButton2_actionPerformed(e);
    }
}


class CodeFrame_jButton1_actionAdapter implements ActionListener {
    private CodeFrame adaptee;
    CodeFrame_jButton1_actionAdapter(CodeFrame adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e) {
        adaptee.jButton1_actionPerformed(e);
    }
}

你可能感兴趣的:(java,swing,F#)