基于JAVA实现的仿WC统计程序

目标要求: wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数,并具备了一定的图形化实现。

1.Github 地址:https://gitee.com/caihaijie/WC.git

2.PSP表格

PSP2.1                                                                预估耗时(分钟   实际耗时(分钟)
Planning 25 30    
Estimate 200 230
Development 120 150
Analysis 20 20
Design Spec 20 20
Design Review 20 20
Coding Standard 10 15
Design 30 45
Coding 150 180
Code Review 20 15
Test 10 20
Reporting 30 40
Test Report 20 20
Size Measurement 10 10
Postmortem & Process Improvement Plan 20 30
  705 855

3.解题思路

 当初看到题目的第一想法就是打算用JAVA写一个简单的图形化窗口,用checkbox复选框实现三个功能的点击选择,用File类获得文件后再计算字符数、单词数、行数,再在TextArea上输出三者的统计结果。

4.设计实现过程

只有一个类:WcGUI

WcGUI包括图形化实现、控件监听方法、主函数

public void createAndShowGUI()图形化实现
class FileChooseListener implements ActionListener 打开文件的监听方法,返回文件
class OneListener implements ActionListener
class  TwoListener implements  ActionListener
class  ThreeListener implements  ActionListener 三个复选框的监听方法,输出字符数、单词数、行数的统计结果


5.代码说明

  1 public class WcGUI {
  2     /**{
  3      * 创建并显示GUI。出于线程安全的考虑,
  4      * 这个方法在事件调用线程中调用。
  5      */
  6     //创建一个文本方便观看输出结果
  7     private TextArea result = new TextArea();
  8    /* 创建三个变量判断字符数、单词数、行数按钮的点击*/
  9     int zifushu = 0;
 10     int dancishu = 0;
 11     int hangshu = 0;
 12 
 13     public void createAndShowGUI() {
 14         // 确保一个漂亮的外观风格
 15         JFrame.setDefaultLookAndFeelDecorated(true);
 16 
 17 
 18         // 创建及设置窗口
 19         JFrame frame = new JFrame("WC");
 20         JButton open = new JButton("open");
 21 
 22           //给open按钮设置监听事件
 23         open.addActionListener(new FileChooseListener());
 24 
 25         frame.setLayout(new BoxLayout(frame,BoxLayout.Y_AXIS));
 26         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 27         JPanel panel = new JPanel();
 28 
 29         // 创建复选框
 30         JCheckBox checkBox01 = new JCheckBox("字符数");
 31         JCheckBox checkBox02 = new JCheckBox("单词数");
 32         JCheckBox checkBox03 = new JCheckBox("行数");
 33 
 34 
 35         checkBox01.addActionListener(new OneListener());
 36         checkBox02.addActionListener(new TwoListener());
 37         checkBox03.addActionListener(new ThreeListener());
 38 
 39         Box topbox = Box.createHorizontalBox();
 40         Box midbox = Box.createVerticalBox();
 41         topbox.add(checkBox01);
 42         topbox.add(checkBox02);
 43         topbox.add(checkBox03);
 44         midbox.add(result);
 45         midbox.add(open);
 46 
 47         /*panel.add(checkBox01);
 48         panel.add(checkBox02);
 49         panel.add(checkBox03);
 50         panel.add(checkBox04);
 51         panel.add(checkBox05);*/
 52         panel.add(topbox);
 53         panel.add(midbox);
 54 
 55         frame.setContentPane(panel);
 56 
 57         // 添加 标签
 58         JLabel label = new JLabel("先勾选功能再open文件");
 59         frame.getContentPane().add(label);
 60 
 61         // 显示窗口
 62         frame.pack();
 63         frame.setBounds(50,50,500,500);
 64         frame.setVisible(true);
 65     }
 66     //文件选择窗口的创建
 67     class FileChooseListener implements ActionListener{
 68 
 69         @Override
 70         public void actionPerformed(ActionEvent e) {
 71             JFileChooser jfc=new JFileChooser();
 72             jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );
 73             jfc.showDialog(new JLabel(), "选择");
 74             File file=jfc.getSelectedFile();//得到文件
 75             if(file.isDirectory()){
 76                 System.out.println("文件夹:"+file.getAbsolutePath());
 77             }else if(file.isFile()){
 78                 System.out.println("文件:"+file.getAbsolutePath());
 79             }
 80             try (BufferedReader br = new BufferedReader(new FileReader(file))) {
 81 
 82                 String s="" ;
 83                 int a=0;//字符数
 84                 int b=0;//行数
 85                 int c=0;//单词数
 86 
 87                 while ((s = br.readLine())!=null){
 88 
 89                     b++;
 90                     a+=s.length();
 91                      c+=s.split("\\s+").length;
 92                 }
 93                 if (zifushu==1){
 94                 result.append("字符数:"+a);}
 95                 if (dancishu==1){
 96                     result.append(("  单词数:"+c));
 97                 }
 98                 if (hangshu==1){
 99                     result.append("  行数:"+b);
100                 }
101                 if (zifushu==0&&dancishu==0&&hangshu==0){
102                     result.append("输出为空,请选择功能");
103                 }
104             } catch (IOException e1) {
105                 e1.printStackTrace();
106             }
107         }
108     }
109     //三个复选框的监听事件
110     class OneListener implements ActionListener{
111         public void actionPerformed(ActionEvent event)
112         {
113             JCheckBox checkBox = (JCheckBox) event.getSource();
114             System.out.println(checkBox.getText() + " 是否选中: " + checkBox.isSelected());
115             if (checkBox.isSelected()==true)
116             {zifushu=1;}
117             else {
118                 zifushu=0;
119             }
120 
121 
122 
123         }
124     }
125     class  TwoListener implements  ActionListener{
126 
127         @Override
128         public void actionPerformed(ActionEvent e) {
129             JCheckBox checkBox = (JCheckBox) e.getSource();
130             System.out.println(checkBox.getText() + " 是否选中: " + checkBox.isSelected());
131             if (checkBox.isSelected()==true) {
132                 dancishu = 1;
133             }
134             else{
135                 dancishu = 0;
136             }
137         }
138     }
139     class  ThreeListener implements  ActionListener{
140 
141         @Override
142         public void actionPerformed(ActionEvent e) {
143             JCheckBox checkBox = (JCheckBox) e.getSource();
144             System.out.println(checkBox.getText() + " 是否选中: " + checkBox.isSelected());
145             if (checkBox.isSelected()==true){
146             hangshu=1;}
147             else{
148                 hangshu = 0;
149             }
150         }
151     }
152 
153     public static void main(String[] args) {
154         // 显示应用 GUI
155         javax.swing.SwingUtilities.invokeLater(new Runnable() {
156             public void run() {
157                 WcGUI wcGUI=new WcGUI();
158                 wcGUI.createAndShowGUI();
159             }
160         });
161     }
162 }

6.测试运行

(1)空文件

(2)八个字符两个单词两行的文件

3.打开文件的窗口

7.遇到的困难及解决方法

由于JAVA已经很久没接触,所以一开始敲代码的时候有点不顺畅。先去csdn看了需要用的函数的相关博客,然后再开始写项目。对于布局控件的操作并不是特别熟练,导致窗口有些简陋(嘻嘻),在计算字符数、单词数、行数的时候,因为钻了牛角尖想得有点复杂,查看了别人的博客后,恍然大悟。

猜你喜欢

转载自www.cnblogs.com/caihaijie/p/9642348.html