Фильтрация файлов JFileChooser на самом деле не фильтрует (по крайней мере, как я и предполагал)

Я пытаюсь настроить JFileChooser так, чтобы через showOpenDialog разрешался только выбор определенного типа файла (pdf).
Я установил фильтр файлов, но не понимаю, какое действие он выполняет в JFileChooser.

Чего я пытаюсь достичь, так это:

  1. Визуально исключайте другие типы файлов, чтобы пользователь не мог выбрать их из списка.
  2. На самом деле предотвращает выбор других типов или недопустимого файла. (т.е. иметь getSelectedFile(), чтобы фактически вернуть действительный файл PDF)

Вот мой код:

    JFileChooser fc = new JFileChooser();
    fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
    fc.setAcceptAllFileFilterUsed(false);
    fc.setFileFilter(new FileNameExtensionFilter("PDF Files", "pdf"));
    fc.setDialogTitle("Load MSDS");
    int op = fc.showOpenDialog(this);
    if(op == JFileChooser.APPROVE_OPTION) {
        File f = fc.getSelectedFile();
        lbl_msds_loaded.setForeground(Color.BLACK);
        lbl_msds_loaded.setText(f.getName() + " (Size: " + utils.FileUtils.getFileSizeMegaBytes(f, 3) + ")");
    }

Я получаю следующее поведение:
Визуально — фильтрация работает, и в диалоговом окне отображаются только PDF-файлы, поэтому я могу выбирать только PDF-файлы из списка.
Но — я все еще могу вручную выбрать недопустимый файл, введя какое-либо имя в поле «Имя файла:» и щелкнув «Открыть» (или нажав Enter).
Например: если я напишу Untitled.png (который существует в текущем открытом каталоге) и открою, я получу этот png-файл загружен.
Или, если написать несуществующее имя файла и нажать «Открыть», я фактически получу новый файл с загруженным именем.
(Под загруженным я подразумеваю файл, который getSelectedFile() будет return).
Есть ли способ запретить диалогу подтверждать действие открытия, если установлен недопустимый файл (конечно, на основе фильтра)?
Разве это не должно иметь место при использовании диалогов JFileChooser с фильтрами? ?

Что именно фильтр здесь делает? Документация для JFileChooser не объясняет ни один из этих аспектов.
Я был бы очень признателен за объяснение того, как это работает.
Также в чем разница между setFileFilter и addChoosableFileFilter? Они дают точно такое же поведение.

Наконец, вот несколько скриншотов диалогового окна и формы JFrame, над которой я работаю, для некоторого контекста:

https://ibb.co/bFVqVmt
https://ibb.co/5BcsXSW
https://ibb.co/2qq0qr9
https://ibb.co/jMXXXyN< br> https://ibb.co/g3kvtfd
https://ibb.co/2FshJpt

Большое спасибо!


person barzn    schedule 07.06.2021    source источник
comment
Я использую Windows 10. Что касается документации - как я уже сказал, часть фильтрации файлов с точки зрения пользователя работает, как и ожидалось, проблем нет. Но как убедиться, что фактически выбранный файл соответствует фильтру, а не только визуально? Нет информации об этом.   -  person barzn    schedule 07.06.2021
comment
Пользователи обычно не вводят имена файлов, когда у них есть список имен файлов для выбора. Вам нужно будет прочитать заголовки файлов, чтобы определить, является ли имя файла, возвращаемое JFileChooser, фактическим файлом PDF. Если я захочу возиться с вашим приложением, я могу создать пакетный файл Windows и назвать его Invinent.pdf.   -  person Gilbert Le Blanc    schedule 07.06.2021
comment
Проверьте: stackoverflow.com/questions/23712309/. Он демонстрирует, как переопределить метод approveSelection() средства выбора файла, чтобы добавить дополнительное редактирование в файл.   -  person camickr    schedule 07.06.2021