现在有如下程序,可以使用文件对话框读取文件,但是没有文件过滤功能,请问该怎么处理?谢谢!!(比如过滤*.txt类型的文件)                  FileDialog fdlg=new FileDialog(this,"打开", FileDialog.LOAD);             
         fdlg.setVisible(true);
         String fname=fdlg.getDirectory()+fdlg.getFile();
         
         try
         {
             FileInputStream fi=new FileInputStream(fname);
             byte buffer[]=new byte[fi.available()];
             fi.read(buffer);
             jTextArea1.setText(new String(buffer));
             fi.close();
         }
         catch(IOException ioe)
         {
             ……………………   
         }

解决方案 »

  1.   

    可以用filechooser,重写accept方法,定义你需要的扩展名
      

  2.   

    filechooser.setCurrentDirectory(new File(".\\certs"));
    filechooser.setApproveButtonText("打开");
    filechooser.setDialogTitle("Open certificate"); filechooser.setFileFilter(new CertFilter());---------------------------------------
    class CertFilter extends javax.swing.filechooser.FileFilter {
    final static String cfg = "cer"; public boolean accept(File f) {
    String s = f.getName();
    int i = s.lastIndexOf('.');
    if (i > 0 && i < s.length() - 1) {
    String extension = s.substring(i + 1).toLowerCase();
    if (cfg.equals(extension)) {
    return true;
    } else {
    return false;
    }
    }
    ;
    return false;
    } // The description of this filter
    public String getDescription() {
    return "certificate files (*.cer)";
    }
    }
      

  3.   

    /*
     * 创建日期 Sep 6, 2005
     * 项目名称 Library.UI
     * 所在包名 jp.kernel.conqueror.lib.ui.filechooser
     * 版权所有 (C) 1996-2005 困了
     */
    package jp.kernel.conqueror.lib.ui.filechooser;import java.io.File;
    import java.util.Collections;
    import java.util.LinkedHashSet;
    import java.util.Set;import javax.swing.filechooser.FileFilter;import jp.kernel.conqueror.lib.lang.LCStringBank;/**
     * 文件类型过滤器
     * 
     * @author 困了
     * @version 1.0.0
     */
    public class LUIFileFilter extends FileFilter {
    /** 描述后缀之间的间隔字符 */
    protected static String strToken; /**
     * 获取描述后缀之间的间隔字符
     * 
     * @return 描述后缀之间的间隔字符
     */
    protected static synchronized String getToken() {
    return null != strToken ? strToken : (strToken = ", ");
    } /** 是否已经设置了描述信息 */
    protected boolean blnHasDes; /** 所有的过滤器 */
    protected Set<String> setFilter; /** 描述信息缓冲池 */
    protected StringBuilder strDescription; /** 完全的描述信息缓冲池 */
    protected StringBuilder strExtensionList; /**
     * 初始化过滤器
     */
    public LUIFileFilter() {
    super();
    } /**
     * 初始化过滤器
     * 
     * @param extension
     *            后缀名
     */
    public LUIFileFilter(String extension) {
    this(extension, null);
    } /**
     * 初始化过滤器
     * 
     * @param extension
     *            后缀名
     * @param description
     *            描述信息
     */
    public LUIFileFilter(String extension, String description) {
    super();
    if (null != extension) {
    addExtension(extension);
    }
    if (null != description) {
    setDescription(description);
    }
    } /**
     * 初始化过滤器
     * 
     * @param filters
     *            一组后缀名
     */
    public LUIFileFilter(String[] filters) {
    this(filters, null);
    } /**
     * 初始化过滤器
     * 
     * @param filters
     *            一组后缀名
     * @param description
     *            描述信息
     */
    public LUIFileFilter(String[] filters, String description) {
    super();
    if (null != filters) {
    for (final String FILTER : filters) {
    addExtension(FILTER);
    }
    }
    if (null != description) {
    setDescription(description);
    }
    } /**
     * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
     */
    public boolean accept(File f) {
    if (null != f) {
    if (f.isDirectory()) {
    return true;
    }
    boolean blnAccept = false;
    StringBuilder strAccept = LCStringBank.lendBuilder();
    strAccept.append(getExtension(f));
    if ((0 < strAccept.length())
    & getFilterSet().contains(strAccept.toString())) {
    blnAccept = true;
    }
    LCStringBank.returnBuilder(strAccept);
    return blnAccept;
    }
    return false;
    } /**
     * 增加一个后缀名
     * 
     * @param extension
     *            后缀名
     */
    public void addExtension(String extension) {
    if (null != extension) {
    getFilterSet().add(extension.trim().toLowerCase());
    setExtensionListInDescription();
    }
    } /**
     * @see javax.swing.filechooser.FileFilter#getDescription()
     */
    public String getDescription() {
    if (blnHasDes) {
    StringBuilder strFull = LCStringBank.lendBuilder();
    strFull.append(getDescriptionBuffer()).append(" (").append(
    getExtensionListBuffer()).append(')');
    final String DES = strFull.toString();
    LCStringBank.returnBuilder(strFull);
    return DES;
    }
    return getExtensionListBuffer().toString();
    } /**
     * 获取描述信息缓冲池
     * 
     * @return 描述信息缓冲池
     */
    protected synchronized StringBuilder getDescriptionBuffer() {
    return null != strDescription ? strDescription
    : (strDescription = new StringBuilder());
    } /**
     * 获取文件后缀名
     * 
     * @param f
     *            文件名称
     * @return 文件后缀名
     */
    protected String getExtension(File f) {
    if (null != f) {
    StringBuilder strExt = LCStringBank.lendBuilder();
    strExt.append(f.getName());
    final int INDEX = strExt.lastIndexOf(".");
    String strExtension = null;
    if ((0 < INDEX) & (INDEX < strExt.length() - 1)) {
    strExtension = strExt.substring(INDEX + 1).toLowerCase();
    }
    LCStringBank.returnBuilder(strExt);
    if (null != strExtension) {
    return strExtension;
    }
    }
    return null;
    } /**
     * 获取完全的描述信息缓冲池
     * 
     * @return 完全的描述信息缓冲池
     */
    protected synchronized StringBuilder getExtensionListBuffer() {
    return null != strExtensionList ? strExtensionList
    : (strExtensionList = new StringBuilder());
    } /**
     * 获取所有的过滤器
     * 
     * @return 所有的过滤器
     */
    protected synchronized Set<String> getFilterSet() {
    return null != setFilter ? setFilter : (setFilter = Collections
    .synchronizedSet(new LinkedHashSet<String>()));
    } /**
     * 移除一个后缀名
     * 
     * @param extension
     *            后缀名
     */
    public void removeExtension(String extension) {
    if (null != extension) {
    getFilterSet().remove(extension.trim().toLowerCase());
    setExtensionListInDescription();
    }
    } /**
     * 设置描述信息
     * 
     * @param description
     *            描述信息
     */
    public void setDescription(String description) {
    if (null != description) {
    StringBuilder strDes = getDescriptionBuffer();
    strDes.delete(0, strDes.length()).append(description);
    blnHasDes = (0 < description.length());
    }
    } /**
     * 设置完全的描述信息
     */
    protected void setExtensionListInDescription() {
    StringBuilder strExt = getExtensionListBuffer();
    strExt.delete(0, strExt.length());
    final Set<String> FILTERS = getFilterSet();
    final String TOKEN = getToken();
    for (final String FILTER : FILTERS) {
    strExt.append("*.").append(FILTER.toUpperCase()).append(TOKEN);
    }
    final int LENGTH = strExt.length();
    strExt.delete(LENGTH - TOKEN.length(), LENGTH);
    }
    }
      

  4.   

    believefym(暮色,miss,迷失,miss)大哥还在吗?
      

  5.   

    我试过 fileChooser的文件过滤了,上面的方法可以。但能不能在FileDialog中实现文件过滤呢?
      

  6.   

    FileDialog有个setFilenameFilter方法setFilenameFilter
    public void setFilenameFilter(FilenameFilter filter)
    Sets the filename filter for this file dialog window to the specified filter. Filename filters do not function in Sun's reference implementation for Microsoft Windows. Parameters:
    filter - the specified filter
    See Also:
    FilenameFilter, getFilenameFilter()------------------
    继承一下FilenameFilter,重写accept方法应该就可以了,楼主可以看看api,应该跟filechooser类似的
      

  7.   

    大家都有JDK吧,jdk\demo\jfc\FileChooserDemo\src\ExampleFileFilter.java
      

  8.   

    谢谢大家的支持!!我用下面的方法重写了 FilenameFilter 的accept()函数,但是不行,请帮忙看下:
    public class MyFilter implements FilenameFilter
    {
        String str="txt";
        public boolean accept(File file,String name)
        {
             int i=name.lastIndexOf('.');
             if (i>0&&i<name.length()-1)
             {
                String extension=name.substring(i+1).toLowerCase();
                if(str.equals(extension))
                    return true;
                else
                    return false;
             }
        }
    }
      

  9.   

    是javax.swing.filechooser.FileFilter而不是FilenameFilter吧你可以直接利用我上面给你的那个文件
      

  10.   

    shine333大哥,不只怎么的,我机子里没有你上面给的那个文件。
    我想声明下:
            我已经实现了javax.swing.filechooser.FileFilter类中的accept()的重载,但只可以在jFile-
    chooser中实现文件过滤。
            我也用类式的方法实现了java.io.FilenameFilter中的accept()的重载,但却不能在FileDialog
    对话框中实现文件的过滤。我想可能是我的accept()方法有问题,你能不能就我上面的accept()改一下。谢谢!!
      

  11.   

    public void setFilenameFilter(FilenameFilter filter)
    Sets the filename filter for this file dialog window to the specified filter. Filename filters do not function in Sun's reference implementation for Microsoft Windows.
    *****************************************************************************************
      

  12.   

    去掉javadocimport java.io.File;
    import java.util.Hashtable;
    import java.util.Enumeration;
    import javax.swing.*;
    import javax.swing.filechooser.*;public class ExampleFileFilter 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 ExampleFileFilter() {
    this.filters = new Hashtable();
        }    public ExampleFileFilter(String extension) {
    this(extension,null);
        }    public ExampleFileFilter(String extension, String description) {
    this();
    if(extension!=null) addExtension(extension);
      if(description!=null) setDescription(description);
        }    public ExampleFileFilter(String[] filters) {
    this(filters, null);
        }    public ExampleFileFilter(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;
        }
    }
      

  13.   

    还是要谢谢你“shine333”大哥!!你所给我的ExampleFileFilter类是继承至FileFilter类的,这个我已经试过了,它可以在jFilechooser里使用,实现文件过滤。因为jFilechooser的jFileChooser1.setFileFilter(filter)中的filter是Filefilter类的一个对象。但是FileDialog1.setFilenameFilter(FilenameFilter filter)中的filter却是一个FilenameFilter对象,需要注意的是FilenameFilter和Filefilter是两个不同的类,所以这样不行的!你可以试一下。    public class MyFilter implements FilenameFilter
        {
            final static String str = "txt";        public boolean accept(File file,String name) {
                    int i = name.lastIndexOf('.');
                    if (i > 0 && i < name.length() - 1) {
                            String extension = name.substring(i + 1).toLowerCase();
                            if (str.equals(extension)) {
                                    return true;
                            } else {
                                    return false;
                            }
                    }                return false;
            }        public String getDescription() {
                    return "文件类型 (*.txt)";
            }
         }
            FileDialog fdlg=new FileDialog(this,"Open",FileDialog.LOAD);
            MyFilter filter=new MyFilter();
            fdlg.setFilenameFilter(filter);
            fdlg.show();上面的代码不能实现文件的过滤。
      

  14.   

    很简单啊
    就是implements FileFilter -> FilenameFilterpublic boolean accept(File file) --> public boolean accept(File dir, String name) { //这个方法乃关键代码
       File file = new File(dir, name);
       后面不变
    }
      

  15.   

    FileDialog dialog = new FileDialog(shell);
    dialog.setFileName("*.txt");
    dialog.open();
    这样就可以实现过滤
      

  16.   

    fileChooser.setDialogTitle("打开播出表文件");
        fileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
          public boolean accept(File f) {
            return f.isDirectory() || f.getName().endsWith(".xml");
          }      public String getDescription() {
            return "xml 文件";
          }
        });