2013-03-23 25 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