对于用于将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);
- }
- }
- }
- }
解决方法
这是,恕我直言,一个错误.
(正如已经明确指出的那样,“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属性更改事件.似乎发生的是,当涉及到更改(特别是)所选文件文本字段时,它忽略了空引用.
我使用Metal和Windows外观测试了这个