JFileChooser Hangs on Windows XP

之前在寫 GOAL 的時候,幾乎每次開啟檔案或是儲存檔案的時候,只要有選擇檔案的視窗出現, GOAL 就會當掉。經過了幾次實驗之後,終於發現問題所在。這一個問題發生的條件蠻多的,當以下所有條件都成立的話,就很容易讓整個程式當掉。
  1. 作業系統為 Window XP 。
  2. 只使用一個 JFileChooser 來開啟檔案選擇視窗。
  3. 使用 CrossPlatformLookAndFeel 的 look-and-feel 。
  4. 至少有一個 FileFilter 用在 JFileChooser 裡面。
  5. 這個 FileFilter 會有條件地接受某些檔案。
  6. 預設 JFileChooser 所開啟的目錄底下有該 FileFilter 所接受的檔案。
  7. 在 showOpenDialog() 之後呼叫了 resetChoosableFileFilters()。
其實這個問題很早就發現了,只是前幾天才實際去測試發生的條件,也有回報給 Sun 並且被接受為 Bug 6857569

要避免這個問題也蠻簡單的,只要讓其中一個條件不成立就可以了。例如:
  1. 使用 Linux 。
  2. 每次都用新的 JFileChooser 來開啟檔案選擇視窗。
  3. 使用系統預設的 look-and-feel 。
  4. 不要在目錄底下擺 FileFilter 會接受的檔案。
  5. showOpenDialog() 移到 resetChoosableFileFilters() 之前。
作為一個使用者,大概只有 1 跟 4 這兩個作法可以選擇。還好我是 GOAL 的 programmer ,可以直接套用上面的第五個方法。雖然改了之後真的沒有再讓程式當掉,但卻也不保證檔案選擇視窗開了成千上萬次之後會不會發生,畢竟每次用都不會開超過 10 次吧。