我想要一个带有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"));
答案 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
数组的一部分,它将被添加到可选择的过滤器中,从而不断显示。