2012-10-04 35 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時使用它。