【问题标题】:FileFilter for JFileChooser doesn't filter files - don't why, have codeJFileChooser 的 FileFilter 不过滤文件 - 不要为什么,有代码
【发布时间】:2011-08-16 09:24:56
【问题描述】:

I want to choose only .csv files with FileChooser but when chooser opens I see all extensions.我还需要设置更多内容吗?

        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 ");
                          }

            }
        });

并且过滤器是嵌套类

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";
      }
    }

【问题讨论】:

  • 您的条件 return f.isFile() || f.getName().toLowerCase().endsWith(".csv"); 将为所有文件返回 true,因为文件的 f.isFile() 将返回 true。如@User1 所述,您需要使用&& 而不是||

标签: java swing jfilechooser filefilter


【解决方案1】:

也许应该是:

    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");

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      应该是:

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

      它也尊重目录。

      【讨论】:

        【解决方案5】:

        问题可能出在这一行:

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

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

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

        【讨论】:

          【解决方案6】:

          尝试这样做:

           public boolean accept(File file) {
          
                  return file.isDirectory() || file.getAbsolutePath().endsWith(".csv");
          }
          

          【讨论】:

            【解决方案7】:

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

            它总是会返回带有有效文件参数的TRUE

            条件应该是

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

            【讨论】:

              【解决方案8】:

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

              chooser.setFileFilter(new CSVFilter());
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-04-30
                • 1970-01-01
                • 2019-12-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多