2012-10-04 32 views
7

对于使用Apache PDFBox合并PDF文件的简单Swing应用程序我使用JFileChooser来选择一个或多个PDF文件并将它添加到JList。 到目前为止没有问题。将文件添加到JList后清除JFileChooser选项

让我困扰的是,当我单击按钮再次添加另一个文件/文件时,先前的选择仍然存在于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中取消选择所以没有文件/文件最初是否被选中?

回答

9

这就是,恕我直言, 错误

(正如我们已经很好地指出的那样,“bug”可能会强化一个词,因为API没有说明如果您将空值传递给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参考。

我测试了使用金属和Windows的外观和感觉

+2

+1错误可能是没有明确的方法来清除当前的选择。人们可能希望传递null会做到这一点,但API显然没有指定这种行为。没有提及在我能找到的任何地方清除当前选择。 –

+2

@Jim同意,文档中没有任何建议如果您向'setSelectedFile'方法传递'null'将会发生什么 – MadProgrammer

+0

不错,此作品,谢谢:) 这样做就足够了: 'File currentDirectory = fc.getCurrentDirectory(); //黑客提醒 fc.setSelectedFile(new File(“”)); fc.setCurrentDirectory(currentDirectory);' – devrys

1

这工作:

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

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

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

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