`
aiou
  • 浏览: 194743 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

一个swing的小工程

    博客分类:
  • java
阅读更多
这个工程用于统计文件或代码行数,原来是帮朋友做的。
第一次用Java UI,swing,虽然是很粗糙的东西,但是还是挺有成就感的,
边学边做大概两天时间,原来什么东西只要认真去做,都可以的。

要求:
做一个如图所示界面的代码统计器。统计器中有一个包含File和Help两个条目的菜单,其中File菜单下面还包含两个子菜单——打开目录(快捷方式为 ctr+O)和退出(快捷方式为 ctr+E)。Help菜单中只包含一个子项——关于CodeNum,用来显示关于本程序的基本信息。文件统计器的主要作用是统计当前制定目录下,指定文件类型的各个文字的代码行数以及总的代码行数值。



结果:
没有指定后缀时,全部文件都统计


如果指定了后缀,只统计制定后缀文件



代码,很粗糙!!!!!!!!!!!!!!!!!!


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("");
    }
}



  • 大小: 50.1 KB
  • 大小: 29.4 KB
  • 大小: 26.7 KB
分享到:
评论

相关推荐

    Java_Swing_KTV工程

    总的来说,"Java_Swing_KTV工程"是一个利用Java Swing技术实现的KTV管理系统前端,它展示了Swing在构建复杂、美观用户界面方面的强大能力。通过深入学习和理解Swing的各种组件和机制,开发者能够创建出更加专业和...

    java魔方小游戏(swing)

    通过这款Java魔方小游戏,我们可以学习到Swing库的使用、GUI设计、事件处理、算法实现以及软件工程中的许多实践原则。对于想要提升Java GUI编程能力或对游戏开发感兴趣的开发者来说,这是一个很好的学习项目。

    设置图片适合swing组件

    - 创建一个简单的Swing应用程序,其中包含一个带有背景图片的`JButton`,并通过监听窗口大小变化事件来动态调整按钮大小及图片尺寸。 - 使用上述方法设置按钮图标,并添加异常处理逻辑,确保程序的健壮性。 #### ...

    软件工程课程设计,教务考试系统 JAVA SWING +Oracle 11g

    在本项目中,我们关注的是一个基于“软件工程课程设计”的教务考试系统,该系统是用JAVA SWING作为前端开发工具,与Oracle 11g数据库进行后端交互。这个系统涵盖了教务员、教师和学生三个角色,提供全方位的教务管理...

    Swing特效的15个例子!!!!

    从网上一个博文上搜集来的一些Swing特效的例子,如xp折叠效果_foldered_pane,鼠标悬停提示_tooltip,玻璃效果闪烁_glassbox,日历组件,环形右键弹出菜单等等.....绝对物超所值! 其中部分例子为jar形式,可直接运行......

    Myeclipse_Swing_Matisse开发swing

    Matisse是Myeclipse集成的一个强大的Swing界面设计器,使得开发者无需编写复杂的布局代码,就能创建出美观的图形用户界面。 首先,开发图形界面在Windows上,Visual Studio提供了直观的可视化工具,使得拖放控件到...

    swing小系统开发

    Swing小系统开发是Java编程领域中的一个实践项目,它主要利用Java的Swing库来构建桌面应用程序。Swing是Java Foundation Classes (JFC)的一部分,提供了丰富的组件库,用于创建用户界面。在这个项目中,开发者可以...

    用swing做的超市管理系统

    在本项目“用Swing做的超市管理系统”中,开发人员充分利用了Swing的组件库和事件处理机制,构建了一个完整的、功能丰富的管理软件,涵盖了超市运营的各个环节。 首先,Swing库提供了丰富的组件,如JFrame(主窗口...

    Java操作系统管理软件(Swing)

    总的来说,"Java操作系统管理软件(Swing)"是一个结合了理论与实践的项目,它展示了如何利用Java和Swing构建一个具有MVC架构的桌面应用。对于想要提升Java GUI编程技能或者对操作系统原理感兴趣的开发者和学生,这...

    基于Java Swing的汽车租赁平台

    【Java Swing】 Java Swing是Java AWT(Abstract Window Toolkit)库的一部分,提供了一套图形用户界面(GUI)组件,用于构建桌面应用。...对于初学者来说,这是一个很好的实践平台,能够提升Java编程和软件工程能力。

    五子棋JavaSwing开发

    【五子棋JavaSwing开发】是一个适合初学者的项目,它涵盖了客户端应用程序的开发以及数据库的使用。在这个项目中,我们将深入学习如何利用Java Swing库来构建图形用户界面(GUI),同时理解数据库与Java程序之间的...

    java swing学生请假系统

    这个系统展示了如何利用Java的Swing库来构建一个功能完善的用户界面,同时包含了数据库交互、业务逻辑处理等多个方面的知识。 1. **Java Swing**:Swing是Java提供的一种用于创建图形用户界面(GUI)的工具包,它是...

    使用Swing书写一个简单的Java代码生成器

    运行环境:Windows XP、JDK 6.0、SQL Server 2000、Oracle 9i、Eclipse...你可以在此基础上进一步修改,然后写成自己的代码生成小工具,或者参见Eclipse插件书写规范,把它写成一个Eclipse的插件来玩,方便小组的开发。

    贪吃蛇java swing

    贪吃蛇是一款经典的休闲游戏,其Java Swing版本的实现展示了如何使用Java的图形用户界面库来构建一个桌面应用。在本项目中,我们将探讨以下几个关键知识点: 1. **Java Swing**: Java Swing是Java Foundation ...

    java swing DVD租赁系统.zip_swing程序设计

    总的来说,Java Swing DVD租赁系统是一个综合性的项目,涵盖了GUI设计、数据库操作、业务逻辑处理等多个方面,对于学习Java Swing和软件工程实践是一个很好的实例。用户可以通过研究这个系统来提升自己的Java GUI...

    JavaSwing图形界面开发与案例详解源代码

    《Java Swing图形界面开发与案例详解》几乎涵盖了目前Java Swing图形开发必备的所有常用知识,拥有丰富的实例,且这些实例均来自于工程实践,《Java Swing图形界面开发与案例详解》适合Java程序语言的初学者阅读,也...

    基于Swing框架的KTV点歌系统

    在本项目中,“基于Swing框架的KTV点歌系统”利用了Swing的这些特性,构建了一个用户界面,尽管作者提到界面美观程度不高,但Swing通过自定义布局管理和外观风格,依然可以实现复杂且美观的UI设计。 【MySQL数据库...

    swing lookandfeel

    在提供的描述中,我们可以推断这可能是一个包含多个L&F库的压缩包,用户只需将其导入工程,就能立即看到界面的改变。这种便捷性使得开发过程更加高效,无需花费大量时间去设计和实现自定义的界面。 在提供的文件...

    Java+Swing+Mysql实现酒店管理系统

    总的来说,这个Java+Swing+MySQL的酒店管理系统是一个综合运用多种技术的实例,展示了如何通过这些技术构建一个完整的业务应用。开发者需要具备扎实的Java基础,熟悉Swing界面设计,以及对数据库管理和软件工程实践...

    Ecplise Swing AWT开发插件一(VE)

    总的来说,"Eclipse Swing AWT开发插件一(VE)"为Java GUI开发提供了一个强大的可视化工具,简化了界面设计过程,使开发者能够更加专注于业务逻辑的实现。结合"VE-runtime-1.2"和"VE-SDK-1.2",开发者不仅可以运行...

Global site tag (gtag.js) - Google Analytics