FileFilter for JFileChooser不会过滤文件 - 不是为什么,有代码

时间:2011-08-16 09:24:56

标签: java swing jfilechooser filefilter

我想只选择带有FileChooser的.csv文件,但是当选择器打开时,我会看到所有扩展名。我需要更多地设置更多吗?

        btnFile.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e){
                        chooser = new JFileChooser(); 
                        chooser.setCurrentDirectory(new java.io.File("."));
                        chooser.setDialogTitle("Choose Value File");
                        chooser.addChoosableFileFilter(new CSVFilter());

                        if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { 
                          System.out.println("getCurrentDirectory(): " 
                             +  chooser.getCurrentDirectory());
                          System.out.println("getSelectedFile() : " 
                             +  chooser.getSelectedFile());
                          }
                        else {
                          System.out.println("No Selection ");
                          }

            }
        });

和Filter是嵌套类

class CSVFilter extends javax.swing.filechooser.FileFilter {
      public boolean accept(File f) {

        return f.isFile() || f.getName().toLowerCase().endsWith(".csv");
      }

      public String getDescription() {
        return "*.csv";
      }
    }

8 个答案:

答案 0 :(得分:6)

也许应该是:

    return f.isFile() && f.getName().toLowerCase().endsWith(".csv");

    return f.isFile() || f.getName().toLowerCase().endsWith(".csv");

答案 1 :(得分:2)

逻辑错误。它应该是

return f.isFile() && f.getName().toLowerCase().endsWith(".csv");

目前您正在接受任何文件。

答案 2 :(得分:2)

您需要FileFilter来过滤视图中的文件。 ChoosableFileFilter不会隐藏文件,只是避免选择它们。看看JFileChooser#setFileFilter(javax.swing.filechooser.FileFilter)

答案 3 :(得分:2)

应该是:

@Override
public boolean accept(File f) {
    return (f.isFile() && f.getName().toLowerCase().endsWith(".csv")) || f.isDirectory();
}

它也尊重目录。

答案 4 :(得分:1)

问题可能在于这一行:

return f.isFile() || f.getName().toLowerCase().endsWith(".csv");

如果文件f是文件,则无论是否为.csv文件,都将返回true。

您可能需要AND(&&)条件而不是OR(||)条件。你想接受任何文件,它是一个文件,它的扩展名是.csv。

答案 5 :(得分:1)

尝试这样做:

 public boolean accept(File file) {

        return file.isDirectory() || file.getAbsolutePath().endsWith(".csv");
}

答案 6 :(得分:0)

在您的CSVFilter中,您有一个名为accept的方法,如果输入参数为TRUE,则返回file OR csv file

它将始终使用有效的文件参数返回TRUE

条件应该是

...
if (f.isFile() && f.isCSVFile())
...

答案 7 :(得分:0)

您需要实际设置filefilter,而不仅仅是将其添加为可选过滤器

chooser.setFileFilter(new CSVFilter());