【问题标题】:Set a new JFileChooser FileFilter and reset previous ones设置一个新的 JFileChooser FileFilter 并重置以前的
【发布时间】:2014-11-12 12:22:11
【问题描述】:

我想要一个具有 2 个选项的文件过滤器,一个显示所有文件,另一个显示特定扩展名。

具体的扩展名应该是默认选择的。

我两次使用相同的 JFileChooser,第一次显示 .fas 文件,第二次显示 .xls 文件。

现在我正在使用此代码,但由于某些原因,它不会覆盖以前的文件扩展名。如果您回收 JFileChooser,那么这里的许多答案都有类似的代码和完全相同的问题。

第一部分,一切正常

fileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
    @Override
    public boolean accept(File file) {
        return file.isDirectory() || file.getAbsolutePath().endsWith(".fas");
    }

    @Override
    public String getDescription() {
        return "Fasta";
    }
});
// more modern API, same result
// fileChooser.setFileFilter(new FileNameExtensionFilter("File fasta", "fas"));

第二部分。这用于同一 JFileChooser 的第二次“打开”。它似乎只是添加了一个过滤器(选择 .fas 文件的选项仍然存在)。

// delete name of previously selected file
File currentDirectory = fileChooser.getCurrentDirectory();
fileChooser.setSelectedFile(new File(""));
fileChooser.setCurrentDirectory(currentDirectory);

// set new file filter
fileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
    @Override
    public boolean accept(File file) {
        return file.isDirectory() || file.getAbsolutePath().endsWith(".xls");
    }

    @Override
    public String getDescription() {
        return "Excel 97";
    }
});
// more modern API, same result
// fileChooser.setFileFilter(new FileNameExtensionFilter("Excel 97", "xls"));

【问题讨论】:

    标签: java jfilechooser filefilter


    【解决方案1】:

    我猜setFileFilter 这个名字可能会产生误导,因为它实际上所做的是设置 selected 文件过滤器(不替换其他过滤器)。

    如果您想回收您的JFileChooser,最简单的解决方案是在设置新过滤器之前致电resetChoosableFileFilters()

    第一次选择的代码

    fileChooser.setFileFilter(new FileNameExtensionFilter("File fasta", "fas"));
    

    第二个选择的代码

    // delete name of previously selected file, but stay in the same directory
    File currentDirectory = fileChooser.getCurrentDirectory();
    fileChooser.setSelectedFile(new File(""));
    fileChooser.setCurrentDirectory(currentDirectory);
    
    // reset current file filters
    fileChooser.resetChoosableFileFilters();
    
    // set new file filter
    fileChooser.setFileFilter(new FileNameExtensionFilter("Excel 97", "xls"));
    
    // the "All files" filter will be present too, unless you uncomment this
    // fileChooser.setAcceptAllFileFilterUsed(false);
    

    【讨论】:

    • 我认为不需要区分第一选择和第二选择。
    • 我认为这比@Thomas 的答案更具可读性(尽管他的答案是正确的)。
    • 另外,我认为最好也调用fileChooser.addChoosableFileFilter(filter);,这样您就不必依赖默认实现将其添加到列表中。
    【解决方案2】:

    尝试使用似乎是驱动组合框模型的xxxChoosableFileFilter() 方法。

    setFileFilter() 似乎设置了用于组合框的基本过滤器(如果没有可选择的过滤器)。但是,如果有可选择的过滤器,则基本过滤器将被忽略。所以我假设在代码中的某个地方(你的或 Swing),基本过滤器被添加到了 choosables 中。

    这是组合框模型之一的 JDK 8 源代码的 sn-p,它似乎可以执行我上面提到的操作:

    public Object getSelectedItem() {
      // Ensure that the current filter is in the list.
      // NOTE: we shouldnt' have to do this, since JFileChooser adds
      // the filter to the choosable filters list when the filter
      // is set. Lets be paranoid just in case someone overrides
      // setFileFilter in JFileChooser.
      FileFilter currentFilter = getFileChooser().getFileFilter();
      boolean found = false;
      if(currentFilter != null) {
        for (FileFilter filter : filters) {
          if (filter == currentFilter) {
             found = true;
          }
        }
        if(found == false) {
          getFileChooser().addChoosableFileFilter(currentFilter);
        }
      }
      return getFileChooser().getFileFilter();
    }
    

    如您所见,问题在于如果当前过滤器不属于模型的filters 数组,则会将其添加到可选过滤器中,从而继续显示。

    【讨论】:

    • 你的意思是也许 setChoosableFileFilter 不是正确的?
    • @Agostino 不,我的意思是使用addChoosableFileFilterresetChoosableFileFilters 而不是setFileFilter
    • resetChoosableFileFilters 是我需要的!我猜名称 setFileFilter 选择不当,因为它实际上是设置 selected 文件过滤器(不替换其他过滤器)。
    • @Agostino 在代码中没有setChoosableFileFilters,至少在 JDK 8 源代码中没有。
    • 我的意思是setFileFilter。现已更正。顺便说一句,答案更简单,我只需要在 setFileFilter 之前添加行 fileChooser.resetChoosableFileFilters(); 即可。
    猜你喜欢
    • 1970-01-01
    • 2019-12-17
    • 2020-04-30
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多