对于用于将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外观测试了这个