Очистить выбор JFileChooser после добавления файлов в JList

для простого приложения Swing для слияния PDF-файлов с Apache PDFBox я использую JFileChooser чтобы выбрать один или несколько файлов PDF и добавить его/их в JList. Пока никаких проблем.

меня беспокоит то, что предыдущий выбор сохраняется в JFileChooser, когда я нажимаю кнопку, чтобы добавить еще один файл/файлы снова, я не хочу этого, выбор должен изначально быть пустым.

Я пробовал это, но он не работает и не бросает исключение:

    pdfFileChooser.setSelectedFile(null);

вот соответствующий код:

    pdfFileChooser.setAcceptAllFileFilterUsed(false);
    pdfFileChooser.setMultiSelectionEnabled(true);
    pdfFileChooser.setFileFilter(new FileFilter() {

       @Override
       public boolean accept(File arg0) {
          return arg0.getName().endsWith(".pdf");
       }
       @Override
       public String getDescription() {
          return "*.pdf";
       }
    } );

    JButton btnAddFile = new JButton("Add file");
    btnAddFile.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent arg0) {
          if(pdfFileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
             addFileToList(pdfFileChooser.getSelectedFiles());
             pdfFileChooser.setSelectedFile(null);
          }
       }
    });

    private void addFileToList(File[] filesToAdd) {
       if((filesToAdd != null) && (filesToAdd.length > 0)) {
          DefaultListModel model = (DefaultListModel)listFiles.getModel();
          for(File file : filesToAdd) {
             if(!model.contains(file)) {
                model.addElement(file);                 
             }
          }
       }
    }

как я могу удалить выбор из JFileChooser, чтобы файл/файлы не были/изначально выбраны?

3 ответов


это, ИМХО, ошибка.

(как было любезно указано, "ошибка" может быть сильным словом, поскольку API не указывает, что произойдет, если вы передали null в selectedFile метод. Вместо этого, вероятно, более разумно предположить, что это недостающая функция)

попробуйте что-то вроде этого...

JFileChooser fc = new JFileChooser();
fc.showOpenDialog(null);
File selected = fc.getSelectedFile();
System.out.println("You selected " + selected);

File currentDirectory = fc.getCurrentDirectory();
// Hack alert
fc.setSelectedFile(new File(""));
fc.setCurrentDirectory(currentDirectory);

fc.showOpenDialog(null);
selected = fc.getSelectedFile();

System.out.println("You selected " + selected);

в основном, изменение выбранного файла, похоже, зависит от пользовательского интерфейса и зависит от SELECTED_FILE_CHANGED_PROPERTY событие изменения свойства. Что кажется случается, что он игнорирует null ссылка, когда дело доходит до изменения (в частности) выбранного текстового поля файл.

Я проверил это с помощью металла и Windows look and feel


это работает:

 fileChooser.setSelectedFile(new File(""));
 fileChooser.setSelectedFiles(new File[]{new File("")});

но если вы хотите более быструю альтернативу, если вы выбрали больше файлов 10K (предыдущий код займет много времени).

 fileChooser.setSelectedFile(new File(""));
 ((FilePane) fileChooser.getComponents()[2]).clearSelection();

Я бы просто создал новый экземпляр JFileChooser и передал ему последний используемый каталог. Последний используемый каталог по умолчанию имеет значение home dir, и при выборе допустимого файла вы сохраняете каталог этого файла и используете его при следующем открытии нового JFileChooser.