2013-03-23 28 views
2

我使用swing創建了一個文件選擇器,僅從Windows平臺上選擇圖像。我用FileFilter來做到這一點。該方法accept()重寫形式的代碼的FileFilter類是:JFileChooser與MyComputer在Windows中的異常

public boolean accept(File f) { 

    System.out.println("File is : " + f.getName() + " " + f); 

    if(f.isDirectory()) 
     return true; 

    String ext = getExtension(f); // returns extensions of the files. 

    if(ext.equals("jpg") || ext.equals("jpeg") || ext.equals("gif") || ext.equals("tif") || ext.equals("tiff")) 
     return true; 
    else { 
     return false; 
} 

它掛時MyComputer選擇形式的windows桌面。以下是進入我得到了我的電腦:

File is ::{20D04FE0-3AEA-1069-A2D8-08002B30309D} Computer

而下面是錯誤消息我得到:

File is ::{20D04FE0-3AEA-1069-A2D8-08002B30309D} Computer 
File is lenovo C:\Users\lenovo 
File is ::{F02C1A0D-BE21-4350-88B0-7367FC96EF3C} Network 
File is ::{031E4825-7B94-4DC3-B131-E946B44C8DD5} Libraries 
File is 4s.txt C:\Users\lenovo\Desktop\4s.txt 
File is cs.bat - Shortcut.lnk C:\Users\lenovo\Desktop\cs.bat - Shortcut.lnk 
File is kaushik.txt C:\Users\lenovo\Desktop\kaushik.txt 
File is rel.txt C:\Users\lenovo\Desktop\rel.txt 
File is SQL Developer.lnk C:\Users\lenovo\Desktop\SQL Developer.lnk 
File is Get Started With Oracle Database 11g Express Edition .lnk C:\Users\Public\Desktop\Get Started With Oracle Database 11g Express Edition .lnk 

雙擊我的電腦後,顯示如下:

File is ::{416651E4-9C3C-11D9-8BDE-F66BAD1E3F3A} ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{416651E4-9C3C-11D9-8BDE-F66BAD1E3F3A} 

Exception in thread "Basic L&F File Loading Thread" java.lang.NullPointerException 
    at gui.ImageFilter.accept(ImageFilter.java:26) 
    at javax.swing.JFileChooser.accept(JFileChooser.java:1576) 
    at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread$1.call(BasicDirectoryModel.java:230) 
    at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread$1.call(BasicDirectoryModel.java:216) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Win32ShellFolderManager2.java:458) 
    at java.lang.Thread.run(Thread.java:619) 

但是,當我在ext初始化後立即添加另一個if條件:

if (ext == null) 
    return false; 

它運行良好。我的問題是,如果MyComputer是爲什麼它被null測試困擾的目錄?它不應該在目錄測試中返回true嗎?另一方面,如果它不是一個目錄(這使它成爲一個文件,對吧?),那它又如何返回true並被文件選擇器打開? 或者是他們的一些其他特殊的角度呢?

Thanx提前!

+0

在哪個操作系統上運行上述示例? – 2013-03-23 10:45:42

+1

我做了一個樣本測試,但它工作正常。我使用的是Windows 7.我認爲你的問題與MyComputer無關,因爲如果你可以從列表中選擇它意味着accept()方法返回true。 – 2013-03-23 10:49:22

+0

@gyuri我也使用Windows 7。是的,accept()方法返回true,但僅在null測試後返回true。我的問題是,爲什麼它必須打擾空測試?我的電腦不是更像是一個目錄嗎?如果不是,那麼它是什麼? – 2013-03-23 10:59:04

回答

0

MyComputer沒有問題,因爲它出現在帶有或不帶空條件的列表中。請檢查FileFilter如何工作here

如文檔中表示:

「A FileFilter可以在JFileChooser設置保持不需要的文件 出現在目錄列表」。

所以,如果accept()方法返回true,指在File通過將出現在列表中,否則爲false。

應用程序掛起,因爲MyComputer可能包含什麼。放置如下日誌:

public boolean accept(File f) { 
       System.out.println("File is : " + f); 
       if(f.isDirectory()) 
        return true;..... 

重新運行沒有null條件的應用程序,以便重現問題,並用您看到的輸出更新您的問題。答案就在那裏。

編輯: 我模擬你的行爲,我得到下面的輸出,請更新類似的輸出你的問題,至少在過去的10行:

File is : Computer 
File is : Network 
File is : Libraries 
File is : Homegroup 
File is : C:\ 
File is : E:\ 
File is : F:\ 
Exception in thread "Basic L&F File Loading Thread" java.lang.NullPointerException: 
    at Main$1.accept(Main.java:17) 
    at javax.swing.JFileChooser.accept(JFileChooser.java:1617) 
    at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.run0(BasicDirectoryModel.java:252) 
    at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.run(BasicDirectoryModel.java:228) 

我希望這有助於。

P.S.:更簡單的方法是使用FileNameExtensionFilter

+0

我編輯了這個問題,請看看!解決此問題後,我一定會嘗試'FileNameExtensionFilter'。 – 2013-03-23 13:13:16

+0

一個更重要的細節:您使用的是哪個JDK? – 2013-03-23 13:29:11

+0

我編輯我的答案。請相應更新問題。我只是想,如果你有任何設備連接到你的電腦,並且存在於我的電腦,如果你在資源管理器中打開它,而不是你的硬盤分區。 – 2013-03-23 13:33:53