将文件添加到JList后清除JFileChooser选择

时间:2012-10-04 22:19:35

标签: java jfilechooser

对于将PDF与Apache PDFBox合并的简单Swing应用程序,我使用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 个答案:

答案 0 :(得分:10)

这是,恕我直言,<罢工>一个错误。

(正如已经指出的那样,“bug”可能是一个强有力的词,因为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);

基本上,所选文件的更改似乎取决于UI,并依赖于SELECTED_FILE_CHANGED_PROPERTY属性更改事件。在更改(特别是)所选文件文本字段时,它似乎忽略了null引用。

我使用Metal和Windows外观测试了这个

答案 1 :(得分:1)

这有效:

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

但是如果你想要更快的替代方案,万一你选择了更多的10K文件(以前的代码需要花费很多时间)。

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

答案 2 :(得分:0)

我只想创建一个新的JFileChooser实例并将最后使用的目录传递给它。上次使用的目录默认为home dir,当您选择有效文件时,您将存储该文件的目录,并在下次打开新的JFileChooser时使用它。