欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java实现显示指定类型的文件

程序员文章站 2024-02-25 21:40:09
文件作为存储数据的单元,会根据数据类型产生很多分类,也就是所谓的文件类型。在对数据文件进行操作时,常常需要根据不同的文件类型来作不同的处理。本实例实现的是读取文件夹指定类型...

文件作为存储数据的单元,会根据数据类型产生很多分类,也就是所谓的文件类型。在对数据文件进行操作时,常常需要根据不同的文件类型来作不同的处理。本实例实现的是读取文件夹指定类型的文件并显示到表格控件中。这对于项目开发中的文件分类起到了抛砖引玉的作用。

思路分析:

因为是窗体应用,首先看视图层。需要一个按钮控件jbutton用来选择文件夹;需要一个标签控件jlabel用来显示选择的路径;需要一个标签控件jlabel提示用户输入什么;需要一个文本框控件jtextfield供用户输入文件类型;需要一个表格控件jtable显示选中目录下指定类型的文件。
对于按钮控件,为其绑定事件处理方法,在该方法中首先创建jfilechooser文件选择器对象,为该对象设置选择器的过滤器,即通过jfilechoose类的setfileselectionmode()方法设定只能选择路径,然后执行showdialog()方法,再使用jfilechooser类的getselectedfile()方法获取选中路径,赋值给一个file型变量,使用tostring()方法将该路径显示在标签中,最后获取过滤后的符合条件的文件数组。
对于文本框控件,一旦里面的文字发生变化,就要重新对选中路径中的文件进行过滤,所以通过jtextfield类的addcaretlistener()方法为其绑定事件处理方法,在该方法中获取过滤后的符合条件的文件数组。
因为按钮控件和文本框控件都要实现过滤及显示,故可以将过滤及显示单独作为一个方法,在该方法中首先判断当前路径是否为空,若不为空则使用file类的listfiles()方法获取符合条件的文件数组,赋值给一个file型数组,然后使用jtable类的getmodel()方法获取表格的数据模型,使用defaulttablemodel类的setrowcount()方法先将表格清空,然后使用foreach()循环遍历文件数组,在循环中使用object[]数组创建表格行数据,调用file类的getname()方法获取文件名,length()方法获取文件大小,lastmodified()方法获取修改日期,最后使用defaulttablemodel类的addrow()方法添加行数据到表格模型。
代码如下:

复制代码 代码如下:

import java.awt.borderlayout;
import java.awt.eventqueue;
import java.awt.gridbagconstraints;
import java.awt.gridbaglayout;
import java.awt.insets;
import java.awt.event.actionevent;
import java.awt.event.actionlistener;
import java.io.file;
import java.sql.date;

import javax.swing.jbutton;
import javax.swing.jfilechooser;
import javax.swing.jframe;
import javax.swing.jlabel;
import javax.swing.jpanel;
import javax.swing.jscrollpane;
import javax.swing.jtable;
import javax.swing.jtextfield;
import javax.swing.border.emptyborder;
import javax.swing.event.caretevent;
import javax.swing.event.caretlistener;
import javax.swing.table.defaulttablemodel;

public class listcustomtypefile extends jframe {
    /**
     *
     */
    private static final long serialversionuid = -6263975104443132420l;

    /**
     * 自定义扩展名过滤器
     *
     * @author 李钟尉
     */
    private final class customfilter implements java.io.filefilter {
        @override
        public boolean accept(file pathname) {
            // 获取用户设置的指定扩展名
            string extname = extnamefield.gettext();
            if (extname == null || extname.isempty())
                return false;
            if (!extname.startswith("."))// 判断扩展名前缀
                extname = "." + extname;// 完事扩展名前缀
            extname = extname.tolowercase();
            // 判断扩展名与过滤文件名是否符合要求
            if (pathname.getname().tolowercase().endswith(extname))
                return true;
            return false;
        }
    }

    private jpanel contentpane;
    private jtextfield extnamefield;
    private jtable table;
    private file dir;
    private jlabel label;

    /**
     * launch the application.
     */
    public static void main(string[] args) {
        eventqueue.invokelater(new runnable() {
            public void run() {
                try {
                    listcustomtypefile frame = new listcustomtypefile();
                    frame.setvisible(true);
                } catch (exception e) {
                    e.printstacktrace();
                }
            }
        });
    }

    /**
     * create the frame.
     */
    public listcustomtypefile() {
        settitle("显示指定类型的文件");
        setdefaultcloseoperation(jframe.exit_on_close);
        setbounds(100, 100, 450, 300);
        contentpane = new jpanel();
        contentpane.setborder(new emptyborder(5, 5, 5, 5));
        contentpane.setlayout(new borderlayout(0, 0));
        setcontentpane(contentpane);

        jpanel panel = new jpanel();
        contentpane.add(panel, borderlayout.north);
        gridbaglayout gbl_panel = new gridbaglayout();
        gbl_panel.columnwidths = new int[] { 93, 54, 0 };
        gbl_panel.rowheights = new int[] { 23, 0, 0 };
        gbl_panel.columnweights = new double[] { 0.0, 1.0, double.min_value };
        gbl_panel.rowweights = new double[] { 0.0, 0.0, double.min_value };
        panel.setlayout(gbl_panel);

        jbutton button = new jbutton("选择文件夹");
        button.addactionlistener(new actionlistener() {
            public void actionperformed(actionevent e) {
                do_button_actionperformed(e);
            }
        });
        gridbagconstraints gbc_button = new gridbagconstraints();
        gbc_button.anchor = gridbagconstraints.north;
        gbc_button.gridx = 0;
        gbc_button.gridy = 0;
        panel.add(button, gbc_button);

        label = new jlabel("文件夹");
        gridbagconstraints gbc_label = new gridbagconstraints();
        gbc_label.fill = gridbagconstraints.horizontal;
        gbc_label.gridx = 1;
        gbc_label.gridy = 0;
        panel.add(label, gbc_label);

        jlabel label_1 = new jlabel("输入指定文件扩展名称:");
        gridbagconstraints gbc_label_1 = new gridbagconstraints();
        gbc_label_1.anchor = gridbagconstraints.east;
        gbc_label_1.insets = new insets(0, 0, 0, 5);
        gbc_label_1.gridx = 0;
        gbc_label_1.gridy = 1;
        panel.add(label_1, gbc_label_1);

        extnamefield = new jtextfield();
        extnamefield.addcaretlistener(new caretlistener() {
            public void caretupdate(caretevent e) {
                do_extnamefield_caretupdate(e);
            }
        });
        extnamefield.settext(".gif");
        gridbagconstraints gbc_extnamefield = new gridbagconstraints();
        gbc_extnamefield.insets = new insets(0, 0, 5, 0);
        gbc_extnamefield.fill = gridbagconstraints.horizontal;
        gbc_extnamefield.gridx = 1;
        gbc_extnamefield.gridy = 1;
        panel.add(extnamefield, gbc_extnamefield);
        extnamefield.setcolumns(10);

        jscrollpane scrollpane = new jscrollpane();
        contentpane.add(scrollpane, borderlayout.center);

        table = new jtable();
        table.setautoresizemode(jtable.auto_resize_off);
        table.setmodel(new defaulttablemodel(new object[][] {}, new string[] {"文件名称", "文件大小","修改日期" }) {
            /**
                     *
                     */
                    private static final long serialversionuid = 5274214559103654856l;
            boolean[] columneditables = new boolean[] { false, false, false };

            public boolean iscelleditable(int row, int column) {
                return columneditables[column];
            }
        });
        table.getcolumnmodel().getcolumn(0).setpreferredwidth(220);
        table.getcolumnmodel().getcolumn(1).setpreferredwidth(85);
        table.getcolumnmodel().getcolumn(2).setpreferredwidth(110);
        scrollpane.setviewportview(table);
    }

    /**
     * 选择文件夹按钮的事件处理方法
     *
     * @param e
     */
    protected void do_button_actionperformed(actionevent e) {
        jfilechooser chooser = new jfilechooser();// 创建文件选择器
        // 设置选择器的过滤器
        chooser.setfileselectionmode(jfilechooser.directories_only);
        chooser.showdialog(this, null);
        dir = chooser.getselectedfile();
        getlabel().settext(dir.tostring());
        // 获取过滤后的符合条件的文件数组
        listfiles();
    }

    /**
     * 显示文件夹中的文件
     */
    private void listfiles() {
        if (dir == null)
            return;
        // 获取符合条件的文件数组
        file[] files = dir.listfiles(new customfilter());
        // 获取表格的数据模型
        defaulttablemodel model = (defaulttablemodel) table.getmodel();
        model.setrowcount(0);
        for (file file : files) {// 遍历文件数组
            // 创建表格行数据
            object[] row = { file.getname(), file.length(),
                    new date(file.lastmodified()) };
            model.addrow(row);// 添加行数据到表格模型
        }
    }

    protected void do_extnamefield_caretupdate(caretevent e) {
        listfiles();
    }

    protected jlabel getlabel() {
        return label;
    }
}

效果如图:
Java实现显示指定类型的文件