9

对于用于将 PDF 与 Apache PDFBox 合并的简单 Swing 应用程序,我使用 aJFileChooser选择一个或多个 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 中删除选择,以便最初选择没有文件/文件?

4

3 回答 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 外观对此进行了测试

于 2012-10-04T22:45:41.250 回答
1

这有效:

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

但是如果您想要一个更快的替代方案,以防您选择了超过 10K 的文件(之前的代码会花费很多时间)。

 fileChooser.setSelectedFile(new File(""));
 ((FilePane) fileChooser.getComponents()[2]).clearSelection();
于 2012-11-10T18:11:06.770 回答
0

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

于 2015-01-21T20:40:17.680 回答