设置一个新的JFileChooser FileFilter并重置以前的

时间:2014-11-12 12:22:11

标签: java jfilechooser filefilter

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

特定扩展名应为默认选择的扩展名。

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

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

第一部分,一切正常

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

2 个答案:

答案 0 :(得分:3)

我想名称setFileFilter可能会产生误导,因为它实际上是设置了选定的文件过滤器(不替换其他过滤器)。

如果您要回收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);

答案 1 :(得分:2)

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

如果没有可选择的过滤器,

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

以下是其中一个组合框模型的JDK 8源代码片段,它似乎与我上面提到的相同:

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数组的一部分,它将被添加到可选择的过滤器中,从而不断显示。