2014-11-12 2 views
1

Я хочу фильтр файлов с двумя параметрами, один для отображения всех файлов, а другой для отображения определенного расширения.Установите новый JFileChooser FileFilter и сбросьте предыдущие

Конкретное расширение должно быть выбрано по умолчанию.

Я использую тот же JFileChooser дважды, первый раз, чтобы показать файлы .fas, а второй - показать файлы .xls.

Сейчас я использую этот код, но по некоторым причинам он не перезаписывает предыдущие расширения файлов. Многие ответы здесь на SO имеют аналогичный код и точно такую ​​же проблему, если вы перерабатываете свой 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")); 

ответ

2

Я думаю, что имя 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); 
+0

Я не вижу необходимости различать первый и второй выбор. – Thomas

+0

@Thomas спасибо, исправлено сейчас – Agostino

+0

Я думаю, что это более читаемо, чем ответ @Thomas (хотя его ответ правильный). – PhoneixS

2

Попробуйте использовать xxxChoosableFileFilter() методы, которые кажутся те движущие модель ComboBox.

setFileFilter(), кажется, задает базовый фильтр, который используется для combobox, если нет выбранных фильтров. Однако, если есть выборочные фильтры, основной фильтр будет проигнорирован. Поэтому я предполагаю, что где-то в коде (ваш или Swing) основной фильтр добавляется в choosables.

Вот отрывок из JDK 8 источника для одной из моделей COMBOBOX, которые, кажется, делать то, что я уже упоминал выше:

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, она добавляется к выбранным фильтрам и, таким образом, продолжает отображаться.

+0

Вы имеете в виду, может быть setChoosableFileFilter не правильная? – Agostino

+1

@Agostino no Я имею в виду использование 'addChoosableFileFilter' и' resetChoosableFileFilters' вместо 'setFileFilter'. – Thomas

+0

resetChoosableFileFilters - это то, что мне нужно! Я думаю, что имя setFileFilter плохо выбрано, потому что в действительности он задает фильтр _selected_ file (без замены других фильтров). – Agostino

Смежные вопросы