3

Windows プラットフォームから画像のみを選択するために、swing を使用してファイル チューザーを作成しました。私はそれを行うために使用しFileFilterました。クラスaccept()からオーバーライドされたメソッドのコードは次のとおりです。FileFilter

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;
}

MyComputerWindows デスクトップから を選択するとハングします。以下は、MyComputer に対して取得したエントリです。

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

myComputer をダブルクリックすると、次のように表示されます。

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)

ifただし、初期化された直後に別の条件を追加するextと:

if (ext == null)
    return false;

それはうまくいきます。私の質問は、なぜディレクトリがテストMyComputerに悩まされたのかということです。ディレクトリ テストでnull返されたはずではありませんか。true一方、それがディレクトリでない場合 (つまり、ファイルになりますよね?)、trueファイル チューザーによってどのように返されて開かれるのでしょうか? それとも、それに対する彼らの他の例外的な角度ですか?

事前にサンクス!

4

1 に答える 1

-1

MyComputer は、null 条件の有無に関係なくリストに表示されるため、問題はありません。ここでFileFilterどのように機能するかを確認してください。

ドキュメントに記載されているように:

「不要なファイルがディレクトリ リストに表示されないようにするためFileFilterに、a を設定できます」。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)

これが役立つことを願っています。

PS: フィルタリングを行う簡単な方法は、使用することですFileNameExtensionFilter

于 2013-03-23T11:45:26.723 に答える