这个工程用于统计文件或代码行数,原来是帮朋友做的。
第一次用Java UI,swing,虽然是很粗糙的东西,但是还是挺有成就感的,
边学边做大概两天时间,原来什么东西只要认真去做,都可以的。
要求:
做一个如图所示界面的代码统计器。统计器中有一个包含File和Help两个条目的菜单,其中File菜单下面还包含两个子菜单——打开目录(快捷方式为 ctr+O)和退出(快捷方式为 ctr+E)。Help菜单中只包含一个子项——关于CodeNum,用来显示关于本程序的基本信息。文件统计器的主要作用是统计当前制定目录下,指定文件类型的各个文字的代码行数以及总的代码行数值。
[img]http://dl.iteye.com/upload/attachment/497685/a8a1db85-bf70-36ed-9d98-25c6cfb3f164.png[/img]
结果:
没有指定后缀时,全部文件都统计
[img]http://dl.iteye.com/upload/attachment/497687/f62cf01e-4d94-36f0-8a0c-818b6dab6273.png[/img]
如果指定了后缀,只统计制定后缀文件
[img]http://dl.iteye.com/upload/attachment/497689/9f6745a2-f484-391e-bb09-35bb4a32cae6.png[/img]
代码,很粗糙!!!!!!!!!!!!!!!!!!
第一次用Java UI,swing,虽然是很粗糙的东西,但是还是挺有成就感的,
边学边做大概两天时间,原来什么东西只要认真去做,都可以的。
要求:
做一个如图所示界面的代码统计器。统计器中有一个包含File和Help两个条目的菜单,其中File菜单下面还包含两个子菜单——打开目录(快捷方式为 ctr+O)和退出(快捷方式为 ctr+E)。Help菜单中只包含一个子项——关于CodeNum,用来显示关于本程序的基本信息。文件统计器的主要作用是统计当前制定目录下,指定文件类型的各个文字的代码行数以及总的代码行数值。
[img]http://dl.iteye.com/upload/attachment/497685/a8a1db85-bf70-36ed-9d98-25c6cfb3f164.png[/img]
结果:
没有指定后缀时,全部文件都统计
[img]http://dl.iteye.com/upload/attachment/497687/f62cf01e-4d94-36f0-8a0c-818b6dab6273.png[/img]
如果指定了后缀,只统计制定后缀文件
[img]http://dl.iteye.com/upload/attachment/497689/9f6745a2-f484-391e-bb09-35bb4a32cae6.png[/img]
代码,很粗糙!!!!!!!!!!!!!!!!!!
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;
public class UI extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
JTextField t1 = new JTextField();
JTextField t2 = new JTextField();
JTextField t3 = new JTextField();
JTextField t = new JTextField();
JMenu menu1 = new JMenu("File");
JMenu menu2 = new JMenu("Help");
Hashtable<String, Boolean> postfixTable = new Hashtable<String, Boolean>();
// String postfixes[] = new String[100];
JMenuBar menubar = new JMenuBar();
JButton ajb;
JTextArea ta;
DefaultTableModel dtm1;
JButton djb;
JButton b1;
JTextField folder;
int clickRow;
JMenuItem exitMenuItem;
JMenuItem open;
Vector postfixVector = new Vector();
Vector columnIdentifiers = new Vector();
String currentFolder = "";
Vector fileInfo = new Vector();
Vector fileList = new Vector();
File[] fl = new File[100];
int total = 0;
JTextArea lbnum;
JButton okButton;
JMenuItem about;
final JTable table1 = new JTable() {
public boolean isCellEditable(int row, int col) {
return false;
}
};
final JTable table = new JTable() {
public boolean isCellEditable(int row, int col) {
return false;
}
};
public UI() {
}
public UI(String s) {
super(s);
showGUI();
pack();
}
// public String[] getPostfixes(){
// Enumeration<String> keys = postfixTable.keys();
// int i = 0;
// while(null != keys && keys.hasMoreElements()){
// postfixes[i] = keys.nextElement();
// i++;
// }
// return postfixes;
// }
public Vector<String> getPostfixVector() {
Enumeration<String> keys = postfixTable.keys();
postfixVector.removeAllElements();
while (null != keys && keys.hasMoreElements()) {
Vector v = new Vector();
v.add(keys.nextElement());
postfixVector.add(v);
}
return postfixVector;
}
public void addPostfix(String postfix) {
ta.setText("");
if (null != postfix && !"".equals(postfix) && !postfixTable.containsKey(postfix)) {
postfixTable.put(postfix, true);
}
getPostfixVector();// 获得向量
refreshTable1();// 刷新table
}
public void removePostfix(String postfix) {
if (null != postfix && !"".equals(postfix) && postfixTable.containsKey(postfix)) {
postfixTable.remove(postfix);
}
getPostfixVector();// 获得向量
refreshTable1();// 刷新table
}
private void refreshTable1() {
columnIdentifiers.removeAllElements();
columnIdentifiers.add("代码文件格式");
dtm1.setColumnCount(1);
dtm1.setDataVector(postfixVector, columnIdentifiers);
table1.setModel(dtm1);
dtm1.setRowCount(8);
table1.repaint();
table1.updateUI();
}
public void showGUI() {
this.setTitle("code num counter");
this.setBounds(350, 50, 700, 650);
// setPreferredSize(new Dimension(700, 650));
this.setJMenuBar(menubar);
menu1.getPopupMenu().setLightWeightPopupEnabled(false);
menubar.add(menu1);
menu2.getPopupMenu().setLightWeightPopupEnabled(false);
menubar.add(menu2);
open = new JMenuItem("打开目录");
open.addActionListener(this);
open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
menu1.add(open);
exitMenuItem = new JMenuItem("退出");
exitMenuItem.addActionListener(this);
exitMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK));
menu1.add(exitMenuItem);
about = new JMenuItem("关于");
about.addActionListener(this);
menu2.add(about);
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
this.setBackground(Color.gray);
JLabel jl = new JLabel(" 目录名称 :");
jl.setLocation(0, 0);
c.fill = GridBagConstraints.BOTH;
c.gridx = 0;
c.gridy = 0;
c.gridheight = 2;
c.gridwidth = 1;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(10, 10, 10, 10);
this.add(jl, c);
folder = new JTextField("");
folder.setPreferredSize(new Dimension(300, 22));
c.fill = GridBagConstraints.WEST;
c.gridx = 1;
c.gridy = 0;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(10, 0, 10, 0);
this.add(folder, c);
b1 = new JButton(" 打开目录 ");
b1.addActionListener(this);
c.fill = GridBagConstraints.BOTH;
c.gridx = 2;
c.gridy = 0;
c.insets = new Insets(10, 10, 10, 10);
c.anchor = GridBagConstraints.EAST;
this.add(b1, c);
c.insets = new Insets(0, 0, 0, 0);
// table.setAutoscrolls(true);
table.setGridColor(Color.gray);
table.setEnabled(true);
// table.setPreferredScrollableViewportSize(new Dimension(500, 400));
DefaultTableModel dtm = new DefaultTableModel();
dtm.setColumnIdentifiers(new Object[] { "文件名", "代码行数" });
dtm.setColumnCount(2);
table.setModel(dtm);
JScrollPane pane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
pane.setBorder(BorderFactory.createTitledBorder(""));
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 2;
c.gridheight = 6;
this.add(pane, c);
// table.setAutoscrolls(true);
table1.setGridColor(Color.gray);
table1.setEnabled(false);
// table.setPreferredScrollableViewportSize(new Dimension(500,400));
dtm1 = new DefaultTableModel();
dtm1.setColumnIdentifiers(new Object[] { "代码文件格式" });
dtm1.setColumnCount(1);
dtm1.setRowCount(8);
table1.setModel(dtm1);
table1.updateUI();
table1.setPreferredSize(new Dimension(50, 130));
table1.setEnabled(true);
MouseAdapter d = new MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent e) {
System.out.println("mouseClicked()");
// System.out.println("row numbers is :" + table1.getRowCount());// 获取表格的总行数
// 获取鼠标点击的行的位置(及行数)
Point mousepoint;
mousepoint = e.getPoint();
clickRow = table1.rowAtPoint(mousepoint);
System.out.println(clickRow);
}
};
table1.addMouseListener(d);
JScrollPane pane1 = new JScrollPane(table1, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
pane1.setBorder(BorderFactory.createTitledBorder(""));
pane1.setPreferredSize(new Dimension(80, 150));
c.gridx = 2;
c.gridy = 2;
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.insets = new Insets(10, 10, 10, 10);
c.fill = GridBagConstraints.BOTH;
this.add(pane1, c);
djb = new JButton("删除选中格式");
djb.addActionListener(this);
c.gridx = 2;
c.gridy = 4;
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.insets = new Insets(10, 10, 10, 10);
c.fill = GridBagConstraints.BOTH;
this.add(djb, c);
JLabel dlb = new JLabel("Input New Postfix:");
c.gridx = 2;
c.gridy = 5;
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.insets = new Insets(10, 10, 0, 10);
c.fill = GridBagConstraints.BOTH;
this.add(dlb, c);
ta = new JTextArea("");
c.fill = GridBagConstraints.BOTH;
c.gridx = 2;
c.gridy = 6;
c.gridwidth = 1;
c.gridheight = 1;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(0, 10, 10, 10);
this.add(ta, c);
ajb = new JButton("添加格式");
ajb.addActionListener(this);
c.gridx = 2;
c.gridy = 7;
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.insets = new Insets(10, 10, 10, 10);
c.fill = GridBagConstraints.BOTH;
this.add(ajb, c);
lbnum = new JTextArea("项目中代码行数:" + "");
c.fill = GridBagConstraints.BOTH;
c.gridx = 0;
c.gridy = 8;
c.gridwidth = 1;
c.anchor = GridBagConstraints.WEST;
c.insets = new Insets(10, 10, 10, 10);
this.add(lbnum, c);
okButton = new JButton("开始统计");
c.fill = GridBagConstraints.BOTH;
c.gridx = 1;
c.gridy = 8;
c.gridwidth = 1;
c.gridheight = 2;
c.anchor = GridBagConstraints.BASELINE;
this.add(okButton, c);
okButton.setMnemonic('D');
okButton.addActionListener(this);
this.setResizable(false);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent arg0) {
if (arg0.getSource().equals(ajb)) {
addPostfix(ta.getText());
}
if (arg0.getSource().equals(djb)) {
String text = (String) table1.getValueAt(clickRow, 0);
removePostfix(text);
}
if (arg0.getSource().equals(b1) || arg0.getSource().equals(open)) {
openFolder();
}
if (arg0.getSource().equals(exitMenuItem)) {
System.exit(0);
}
if (arg0.getSource().equals(okButton)) {
try {
caculate();
} catch (IOException e) {
e.printStackTrace();
}
}
if (arg0.getSource().equals(about)) {
JOptionPane jop= new JOptionPane();
jop.showMessageDialog(null, "about me, 本程序的基本信息");
}
}
public void openFolder() {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setAcceptAllFileFilterUsed(false);
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
System.out.println("getCurrentDirectory(): " + chooser.getCurrentDirectory());
System.out.println("getSelectedFile() : " + chooser.getSelectedFile());
currentFolder = chooser.getSelectedFile().toString();
this.folder.setText(currentFolder);
// getFileList();
// refreshTable();
lbnum.setText("项目中代码行数:" );
} else {
System.out.println("No Selection ");
}
}
public void getFileList() {
fileInfo.removeAllElements();
fl = new File[1000];
if (!(null == currentFolder) && !"".equals(currentFolder)) {
File d = new File(currentFolder);// 建立当前目录中文件的File对象
File[] fls = d.listFiles();// 取得目录中所有文件的File对象数组
int j = 0;
for (int i = 0; i < fls.length; i++) {
// 目录下的文件:
File e = fls[i];
String name = e.getName();
if (e.isFile()) {
String suffix = getSuffix(name);
if(postfixTable.size() > 0 ){
if( postfixTable.containsKey(suffix)){
System.out.println(e.getName());
Vector v = new Vector();
v.add(e.getName());
v.add("");
fileInfo.add(v);
fl[j] = fls[i];
j++;
}
}else{
System.out.println(e.getName());
Vector v = new Vector();
v.add(e.getName());
v.add("");
fileInfo.add(v);
fl[j] = fls[i];
j++;
}
}
// 目录下的目录:
if (e.isDirectory()) {
// System.out.println(e.getName());
}
}
} else {
System.out.println("no folder");
}
}
private String getSuffix(String name) {
if(!"".equals(name)){
System.out.println(name);
String suffix = name.substring(name.lastIndexOf(".") , name.length());
System.out.println(suffix);
return suffix;
}else{
return "all";
}
}
public void refreshTable() {
Vector columnIdentifiers = new Vector();
columnIdentifiers.removeAllElements();
columnIdentifiers.add("文件名");
columnIdentifiers.add("代码行数");
DefaultTableModel dtm1 = new DefaultTableModel();
dtm1.setColumnCount(2);
dtm1.setDataVector(fileInfo, columnIdentifiers);
table.setModel(dtm1);
table.repaint();
table.updateUI();
}
public void caculate() throws IOException {
getFileList();
fileInfo.removeAllElements();
total = 0;
for (int i = 0; i < fl.length; i++) {
if (null != fl[i]) {
int count = 0;
InputStream input = new FileInputStream(fl[i]);
BufferedReader b = new BufferedReader(new InputStreamReader(input));
String value = b.readLine();
while (value != null) {
count++;
value = b.readLine();
}
b.close();
input.close();
total += count;
Vector v = new Vector();
v.add(fl[i].getName());
v.add(count);
fileInfo.add(v);
}
}
refreshTable();
lbnum.setText("项目中代码行数:" + total);
}
public static void main(String[] args) {
new UI("");
}
}