Java实现显示指定类型的文件
文件作为存储数据的单元,会根据数据类型产生很多分类,也就是所谓的文件类型。在对数据文件进行操作时,常常需要根据不同的文件类型来作不同的处理。本实例实现的是读取文件夹指定类型的文件并显示到表格控件中。这对于项目开发中的文件分类起到了抛砖引玉的作用。
思路分析:
因为是窗体应用,首先看视图层。需要一个按钮控件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;
}
}
效果如图: