搜索
简帛阁>技术文章>Java中文件选择框JFileChooser的用法

Java中文件选择框JFileChooser的用法

在看JFileChooser之前,先了解一下File这个文件类,其实更贴切点说应该叫文件路径类。因为这个类不仅可以实现对文件的操作,还可以对目录进行相关的操作。
可以把File类看作是对文件和目录的一个实用工具类。他里面有许多有用的方法,首先来看下他的构造方法:
要创建File对象必须要先创建它的对象,并且构造方法需要带参数。他一共有4个构造方法,一般比较常用的是下面三种:

//根据File对象parent的路径和字符串child连接起来形成个新的字符串,并将其作为新File的路径名字字符串
File(File parent, String child) 
//根据字符串pathname作为路径名字创建新的File对象
File(String pathname) 
//根据字符串parent和child作为路径名字创建新的File对象
File(String parent, String child) 

比较常用的方法:
boolean canRead() 判断文件是否可读
boolean canWrite() 判断文件是否可写
int compareTo(File pathname) 按字母顺序比较两个File对象的路径
boolean delete() 删除目录或者文件
boolean exists() 测试此文件或目录是否存在
File getAbsoluteFile() 返回抽象路径的File对象
String getAbsolutePath() 返回绝对路径
String getName() 返回该文件或目录的名字
String getParent() 返回该抽象路径的父路径名,如果没有父路径则返回null
String getPath() 将抽象路径名转换为字符串]
boolean isAbsolute() 判断该抽象路径是否是一个绝对路径
boolean isDirectory() 判断是否为目录
boolean isFile() 判断是否为文件
boolean isHidden() 判断是否为隐藏
long lastModified() 获得最后一次修改的时间,该时间是一个毫秒数
long length() 获得文件的长度
String[] list() 将该抽象路径下的所有文件和目录路径名字符串包存在一个字符串数组中。这个方法非常有用。

其实JFileChooser基本使用方法还是很简单的,下面写两个示例看了就明白了,如果还要增加一些功能,我们还可以添加过滤器,只显示过滤后的文件。还可以再保存的时候,如果保存的是目录里已经存在的文件,那么对话框不会关闭,并且弹出一个JOptionPane提示用户是否保存文件。

打开文件对话框:

import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;

public class FileChooserTest {

public static void main(String [] args) {

//首先是创建JFileChooser 对象,里面带个参数,表示默认打开的目录,这里是默认打开当前文件所在的目录。

JFileChooser file = new JFileChooser (".");
//下面这句是去掉显示所有文件这个过滤器。
file.setAcceptAllFileFilterUsed(false);
//添加excel文件的过滤器
file.addChoosableFileFilter(new ExcelFileFilter("xls"));
//添加exe文件的过滤器
file.addChoosableFileFilter(new ExcelFileFilter("exe"));

/*使用showOpenDialog()方法,显示出打开选择文件的窗口,当选择了某个文件后,或者关闭此窗口那么都会返回一个

整型数值,如果返回的是0,代表已经选择了某个文件。如果返回1代表选择了取消按钮或者直接关闭了窗口*/
int result = file.showOpenDialog(null);

/*JFileChooser.APPROVE_OPTION是个整型常量,代表0。就是说当返回0的值我们才执行相关操作,否则什么也不做。
if(result == JFileChooser.APPROVE_OPTION)
{

/*获得你选择的文件绝对路径。并输出。当然,我们获得这个路径后还可以做很多的事。
   String path = file.getSelectedFile().getAbsolutePath();
   System.out.println(path);
}
else
{

    System.out.println("你已取消并关闭了窗口!");
   }
}

/*因为我们需要创建一个文件的过滤器,以便让文件对话框显示我们指定的文件。这里我们就以Excel文件和exe文件举例。

那么要做到这点我们就需要重写FileFilter 类的accept来设置相关的过滤器。这个继承类你可以写成外部类、内部类甚至是

匿名内部类。我这里写成了一个内部类的形式。因为是在main方法使用他,因此这个类也要定义成 静态的。

private static class ExcelFileFilter extends FileFilter {

String ext;

//构造方法的参数是我们需要过滤的文件类型。比如excel文件就是 xls,exe文件是exe.

ExcelFileFilter(String ext) {

   this.ext = ext;
}

/*这个方法就是重写 FileFilter 类的方法,参数是File对象,一般这个参数是如何传入的我们可以不用关心。他返回一个布尔型。如果为真表示该文件符合过滤设置,那么就会显示在当前目录下,如果为假就会被过滤掉。

public boolean accept(File file) {

//首先判断该目录下的某个文件是否是目录,如果是目录则返回true,即可以显示在目录下。

   if (file.isDirectory())
   {
    return true;
   }

//获得某个文件的文件名,然后使用lastIndexOf()来获得这个文件名字符串中'.'这个字符最后一次出现的位置。并且通过它返回的一个整型来判断该文件是否符合*.*这中文件+文件名的格式,如果不符合那么就不显示这个文件。如果符合,那么就将'.'字符后面的字符串提取出来与过滤的文件名相比较,如果相等则符合该文件格式,并显示出来。如果不相等那么就将其过滤掉。*/

   String fileName = file.getName();
   int index = fileName.lastIndexOf('.');

   if (index > 0 && index < fileName.length() - 1)
   {
    String extension = fileName.substring(index + 1).toLowerCase();
    if (extension.equals(ext))
     return true;
   }
   return false;
}

/*这个方法也是重写FileFilter的方法,作用是在过滤名那里显示出相关的信息。这个与我们过滤的文件类型想匹配,通过这些信息,可以让用户更清晰的明白需要过滤什么类型的文件。*/ 

public String getDescription() {

   if (ext.equals("xls"))
   {
    return "Microsoft Excel文件(*.xls)";
   }
   if(ext.equals("exe"))
   {
    return "可执行文件(*.exe)";
   }
   return "";
}
}

}



打开选择文件的对话框就建立好了。但是上面的程序还有瑕疵。因为只有当用户点取消或关闭该窗口时才不会执行任何操作。而如果用户在对话框里输入的文件在当前目录中不存在时,那么窗口依然会关闭,这时可能就需要在程序中再来做判断。那么可不可以在当用户输入错误的文件名后,窗口不会关闭,而是不执行任何操作或者弹出个对话框提示用户,可以看看大多数window程序中的选择对话框都是这么做的,其实要实现这个功能也不难, 只需要再重写一下JFileChooser类的approveSelection()方法就行了。

我们将上面的程序做下修改,首先还是需要创建一个继承于JFileChooser的类,这个类可以写成外部或者内部类,我们这里依然写为内部类,注意,如果需要在静态方法中调用它,则需要将它设置为静态的。

private static class MyChooser extends JFileChooser {
MyChooser(String path) {
   super(path);
}

/**
   * 重载JFileChooser的方法,当在文件选择对话框中,并在当前
   * 目录下没有找到输入的文件,则对话框不会关闭。直到选择的文件 在当前选择的目录下,才关闭对话框,并执行后面的操作。
   */
public void approveSelection() {

   File file = new File(getSelectedFile().getPath());

if (file.exists())
    super.approveSelection();
   else
    JOptionPane.showMessageDialog(null, "你选择的文件不存在,请重新选择!"); 

}

把上面这段代码添加进刚才的类里面,然后把

JFileChooser file = new JFileChooser (".");改成

JFileChooser file = new MyChooser (".");

好了,现在我们就可以在不关闭该对话框的情况下判断用户的输入是否错误了。还可以加入正则表达式,判断用户输入是否符合规定,操作方式按照这个框架来写就没问题了。这里不再赘述。下面是保存对话框!

保存对话框:

其实保存对话框和打开文件对话框在使用上没什么区别,他们都是使用同一个类JFileChooser,因为在swing当中打开和保存对话框不会做出任何对文件进行处理的功能,所有的这些功能需要我们自己去实现,而仅仅是提供了1个这样的窗口模型而已。因此这两种窗口其实只是将按钮的标签进行了替换而已 。创建他们唯一的区别就是打开是调用showOpenDialog()方法,保存则是调用showSaveDialog(),创建形式几乎一样。我们在使用他们的时候就需要分别对这两种窗口的返回后进行不同的处理,设置过滤器是一样的,因此过滤器我们就复用上面打开文件窗口的方法,但是在判断输入保存文件是否在当前目录下时,我们需要做出不一样的处理。当用户输入了与当前目录相同的文件名后,要弹出对话框询问用户是否需要覆盖原文件,如果用户选择否,那么返回保存文件的对话框允许用户继续选择或者输入保存的文件名。

下面我只需要修改上面代码的两个地方就能够达到目的。首先将修改一下MyChooser这个类

private static class MyChooser extends JFileChooser {
MyChooser(String path) {
   super(path);
}

/*同样是覆盖approveSelection方法,首先获得输入文件的路径,然后判断其是否在当前目录下,如果存在,那么弹出对话框询问是否需要覆盖当前文件,如果选择取消,则回到保存对话框,用户可以继续进行保存的操作。*/
public void approveSelection() {
   File file = this.getSelectedFile();
   if (file.exists())
   {
    int copy = JOptionPane.showConfirmDialog(null,
      "是否要覆盖当前文件?", "保存", JOptionPane.YES_NO_OPTION,
      JOptionPane.QUESTION_MESSAGE);
    if (copy == JOptionPane.YES_OPTION)
     super.approveSelection();
   }
   else
    super.approveSelection();
}
}

再把上面的

int result = file.showOpenDialog(null); 

改成

int result = file.showSaveDialog(null); 

两个基本的选择文件对话框就创建完成了。

如果需要多选,那么要设置setMultiSelectionEnabled(true)

那么File file = this.getSelectedFile();这句我们就要改成

File [] files = this.getSelectedFiles();

files这个数组里面就存放的是选择多个文件File对象,然后我们只需要对这个数组进行操作即可。
在看JFileChooser之前,先了解一下File这个文件类,其实更贴切点说应该叫文件路径类。因为这个类不仅可以实现对文件操作,还可以对目录进行相关操作。可以把File类看作是对文件和目录一个
文件加密器,操作过程肯定涉及到文件选择器使用,所以这里以文件加密器为例。下例为我自己写一个文件加密器,没什么特别的加密算法,只为演示文件选择器JFileChooser使用。加密器界面如图:项目目
极少部分人运气不好可能遇到这样一个问题。只要实例化JFileChooser对象就会报空指针异常;就这一行代码出错说明不是代码问题,应该是JDK或者电脑权限问题。这个小编能力有限,修复不了这个问题,
本案例通过使用JFileChooser实现对选定文件夹内图片实现自动播放和暂停播放代码如下,如有不合适地方还请指教packagecomxiaoqiang;importjavaawtContaine
本文实例讲述了javaenum用法。分享给大家供大家参考。具体分析如下:1基本用法代码如下:enumDay{SUNDAY,MONDAY,TUESDAY,WENDSDAY,THURSDAY,FRID
final从字面翻译来看,有最后,最终;决定性;不可更改等含义,在java里面主要还是“不可改变”这层意思,不可改变或者不想改变final主要用在类、方法、数据这三个方面。一、final类
锁多个线程各自占有一些公共资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等对方释放资源,都停止执行情形。某一个同步块拥有“两个以上对象锁”时,就可能发生死锁问题。死锁
//方式一:使用post请求方式,不通过url传参,采用data传参$ajax({url:userAction_findMangerByDeptId,//访问地址type:post,data:{
前言众所周知Java提供File类,让我们对文件进行操作,下面就来简单整理了一下File类用法。话不多说了,来一起看看详细介绍吧1基本概念File:文件和目录路径名抽象表示形式,代表文件或者文件
1阐述对于JavaMap遍历方式,很多文章都推荐使用entrySet,认为其比keySet效率高很多。理由是:entrySet方法一次拿到所有key和value集合;而keySet拿到只是k