JFileChooser添加文件过滤

摘要:
filter.addExtension(“jpg”);filter.addExtension(“gif”);filter.setDescription(“JPG&chooser.setFileFilter(filter);interturnVal=chooser.showOpenDialog(父级);*A<*canbesetona<JFileChooser<

这是java的Swing里的一个选择文件的控件,我们要如何使用它?首先来看看JDKAPI的说明:

public class JFileChooserextends JComponentimplements Accessible

JFileChooser 为用户选择文件提供了一种简单的机制。有关使用 JFileChooser 的更多信息,请参阅 《The Java Tutorial》 中的 How to Use File Choosers 一节。

以下代码弹出一个针对用户主目录的文件选择器,其中只显示 .jpg 和 .gif 图像: 

    JFileChooser chooser = new JFileChooser();
// Note: source for ExampleFileFilter can be found in FileChooserDemo,
    // under the demo/jfc directory in the JDK.
    ExampleFileFilter filter = new ExampleFileFilter();
    filter.addExtension("jpg");
    filter.addExtension("gif");
    filter.setDescription("JPG & GIF Images");
    chooser.setFileFilter(filter);
    int returnVal = chooser.showOpenDialog(parent);
    if(returnVal == JFileChooser.APPROVE_OPTION) {
       System.out.println("You chose to open this file: " +
            chooser.getSelectedFile().getName());
    }

这是一个例子,上面代码中,new了一个ExampleFileFilter,然后设置它允许的文件后缀名,再设置描述。最后JFileChooser设置一个文件过滤器就OK了。使用的使用showOpenDialog()。

但是这个ExampleFileFilter是怎么来的呢?我们注意到上面有两行注释:

// Note: source for ExampleFileFilter can be found in FileChooserDemo,
// under the demo/jfc directory in the JDK.

它的意思大概是这个ExampleFileFilter类的源码,在FileChooserDemo的jfc文件夹里可以找到。

然后我去找了一下,发现没有这个类源码。

我看下chooser.setFileFilter(xxx)接受的类型,是个抽象类:

/*
 * %W% %E%
 *
 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package javax.swing.filechooser;

import java.io.File;

/**
 * <code>FileFilter</code> is an abstract class used by {@code JFileChooser}
 * for filtering the set of files shown to the user. See 
 * {@code FileNameExtensionFilter} for an implementation that filters using
 * the file name extension.
 * <p>
 * A <code>FileFilter</code> 
 * can be set on a <code>JFileChooser</code> to
 * keep unwanted files from appearing in the directory listing.
 * For an example implementation of a simple file filter, see
 * <code><i>yourJDK</i>/demo/jfc/FileChooserDemo/ExampleFileFilter.java</code>.
 * For more information and examples see 
 * <a href="http://t.zoukankan.com/http://java.sun.com/docs/books/tutorial/uiswing/components/filechooser.html">How to Use File Choosers</a>,
 * a section in <em>The Java Tutorial</em>.
 *
 * @see FileNameExtensionFilter
 * @see javax.swing.JFileChooser#setFileFilter
 * @see javax.swing.JFileChooser#addChoosableFileFilter
 *
 * @version %I% %G%
 * @author Jeff Dinkins
 */
public abstract class FileFilter {
    /**
     * Whether the given file is accepted by this filter.
     */
    public abstract boolean accept(File f);

    /**
     * The description of this filter. For example: "JPG and GIF Images"
     * @see FileView#getName
     */
    public abstract String getDescription();
}

从类的注释可以看到,我们简单地继承它,实现这两个方法就可以实现文件过滤。简单说明:

accept(File f) 方法:对文件进行过滤,通过就返回true。我们可以简单地判断文件的后缀名

getDescription()方法:文件类型的描述,直接返回String方可。

我们可以简单实现它:

public class MyFileFilter extends FileFilter {
        public boolean accept(File f) {
            if(f.getName().contains(".jpg") || f.isDirectory()){
                return true;
            }
return false; } public String getDescription() { return "jpg文件"; } }

然后在fileChooser.setFileFilter(MyFileFilter) 即可,效果如下:

JFileChooser添加文件过滤第1张

这样一个简单的文件过滤就实现了。

======================================================================

最后我还是不死心,终于在jdk1.4的demo里找到了ExampleFileFilter.java。不知道为什么JDK1.5移除了它。附上:

import java.io.File;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.swing.filechooser.FileFilter;

public class MyFileFilter extends FileFilter {
    private static String TYPE_UNKNOWN = "Type Unknown";
    private static String HIDDEN_FILE = "Hidden File";
    private Hashtable filters = null;
    private String description = null;
    private String fullDescription = null;
    private boolean useExtensionsInDescription = true;

    public MyFileFilter() {
        this.filters = new Hashtable();
    }

    public MyFileFilter(String extension) {
        this(extension, null);
    }

    public MyFileFilter(String extension, String description) {
        this();
        if (extension != null)
            addExtension(extension);
        if (description != null)
            setDescription(description);
    }

    public MyFileFilter(String[] filters) {
        this(filters, null);
    }

    public MyFileFilter(String[] filters, String description) {
        this();
        for (int i = 0; i < filters.length; i++) {
            // add filters one by one
            addExtension(filters[i]);
        }
        if (description != null)
            setDescription(description);
    }

    public boolean accept(File f) {
        if (f != null) {
            if (f.isDirectory()) {
                return true;
            }
            String extension = getExtension(f);
            if (extension != null && filters.get(getExtension(f)) != null) {
                return true;
            }
            ;
        }
        return false;
    }

    public String getExtension(File f) {
        if (f != null) {
            String filename = f.getName();
            int i = filename.lastIndexOf('.');
            if (i > 0 && i < filename.length() - 1) {
                return filename.substring(i + 1).toLowerCase();
            }
            ;
        }
        return null;
    }

    public void addExtension(String extension) {
        if (filters == null) {
            filters = new Hashtable(5);
        }
        filters.put(extension.toLowerCase(), this);
        fullDescription = null;
    }

    public String getDescription() {
        if (fullDescription == null) {
            if (description == null || isExtensionListInDescription()) {
                fullDescription = description == null ? "(" : description
                        + " (";
                // build the description from the extension list
                Enumeration extensions = filters.keys();
                if (extensions != null) {
                    fullDescription += "." + (String) extensions.nextElement();
                    while (extensions.hasMoreElements()) {
                        fullDescription += ", ."
                                + (String) extensions.nextElement();
                    }
                }
                fullDescription += ")";
            } else {
                fullDescription = description;
            }
        }
        return fullDescription;
    }

    public void setDescription(String description) {
        this.description = description;
        fullDescription = null;
    }

    public void setExtensionListInDescription(boolean b) {
        useExtensionsInDescription = b;
        fullDescription = null;
    }

    public boolean isExtensionListInDescription() {
        return useExtensionsInDescription;
    }

}

大家直接用它就可以了。

这个网站很多学习资料

免责声明:文章转载自《JFileChooser添加文件过滤》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 时间戳(TimeStamp)与时间(DateTime)的互相转换redis++:Redis的两种持久化 RDB 和 AOF (一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JavaWeb学习记录(一)——response响应头之缓存设置与下载功能的实现

一、HTTP中常用响应头 Location: http://www.it315.org/index.jsp Server:apache tomcat Content-Encoding: gzip Content-Length: 80 Content-Language: zh-cn Content-Type: text/html; charset=GB23...

linux常见故障处理

目录 一. 文件和目录类 1.1 File exist 文件已经存在 1.2 No such file or directory 没有这个文件或目录(这个东西不存在) 1.3 command not found 命令找不到(没有这个命令) 1.4 invalid option 无效的参数(不可用的参数) 1.5 overwrite 覆盖 1.6 r...

MyBatis 物理分页

MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据offset和limit截断记录返回 为了在数据库层面上实现物理分页,又不改变原来MyBatis的函数逻辑,可以编写plugin截获MyBatis Executor的statementhandler,重写SQL来执行查询 参考资料: http://blog....

JavaScript中XMLHttpRequest实现跨域访问

JavaScript的跨域访问方法有很多,不下十种。本文总结的是XMLHttpRequest的跨域访问。 在JavaScript中,我们可以用XMLHttpRequest访问服务端应用。但是浏览器对这类访问有一个限制,就是JavaScript所在页面与所访问的服务端应用必须属于同一个域内,也就是同一个IP和端口号内。这就是JavaScript同源策略(Ac...

JAVA实现聚类指标的计算Purity、NMI、RI、Precision、Recall、F值。

第一个:计算NMI的: package clusters; import java.io.*;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; /** * DATE: 16-6-18 TIME: 上午10:00 */...

Flash Images 效果实现(原作)

        前一些时间,看到好多网站上的Flash Images新闻,效果很是不错.当时很是感兴趣,自己就想研究一下此效果是怎么实现的.于是Google啊,没有找到我想要的源代码,或在一个群里,一个网友给了他们公司一个同事一前用过的一段代码;但另人失望的是,那个代码是Javascript静态实现图片滚动新闻的;但我们实际应用中不可能做成静态的吧,那样就...