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

10

我正在使用Apache PDFBox创建一个简单的Swing应用程序来合并PDF,使用 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个回答

14

依我之见,这是一个缺失的功能一个错误。(正如其他人指出的那样,"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外观进行了测试。

2
+1 可能存在的错误是没有明确的方法来清除当前的选择。虽然可以希望传递 null 可以实现清除,但 API 明显没有指定这种行为。我找不到任何地方提到清除当前选择的内容。 - Jim Garrison
2
@Jim同意,文档中没有任何提示,如果您将null传递给setSelectedFile方法会发生什么。 - MadProgrammer
不错,这个可行,谢谢 :) 只需要这样做就可以了: File currentDirectory = fc.getCurrentDirectory(); // Hack alert fc.setSelectedFile(new File("")); fc.setCurrentDirectory(currentDirectory); - devrys
2
fc.setSelectedFile(new File("")); 这就是我需要让它工作的全部内容。谢谢! - shieldgenerator7
在我的MacOSX(El Capitan Java 8)上似乎不起作用。 - John Tang Boyland
@JohnTangBoyland 我会验证它在Windows上使用Java 8和Metal L&F正常工作,因为不同的L&F /操作系统可能会有所不同。 - MadProgrammer

1

这个有效:

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

但如果你想要一个更快的替代方案,以防你选择了超过10K个文件(先前的代码需要很长时间)。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接