1

UNC パス上のすべてのファイルの完全なリストが必要です。メソッドを使用すると、ファイルのリストが非常に遅くなりjava.io.File.listFiles()ます。FileSystemView.getSystemIcon私のアプリケーションは、それをレンダリングするために使用してファイルアイコンを取得しようとすると、スタックしますJTable。メソッドの下の特定のコードにコメントを付けると、runスタックしません。この問題を解決するにはどうすればよいですか?

import java.io.File;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.filechooser.FileSystemView;

/**
 *
 * @author admin
 */
public class MySwingWorker implements Runnable {

    private JLabel label;
    private String strFile;
    private Icon icon;

    public MySwingWorker(String strFile, JLabel label) {
        this.strFile = strFile;
        this.label = label;
    }

    @Override
    public void run() {
        File f = new File(strFile);
        try {
            FileSystemView fw = FileSystemView.getFileSystemView();
            if (f.exists() == true) {
                icon = fw.getSystemIcon(f);
            } else {
                File fTemp = new File(System.getProperty("pro.temp.home"), "Temp");
                if (fTemp.exists() == false) {
                    try {
                        fTemp.mkdirs();
                    } catch (Exception ex) {
                        //ignored
                    }
                }
                //Replaced "Temp" with fTemp
                File fNewFile = new File(fTemp, f.getName());
                if (fNewFile.createNewFile()) {
                    icon = fw.getSystemIcon(fNewFile);
                }
            }
        } catch (Exception e) {
        }
        label.setIcon(icon);

    }
}
4

3 に答える 3

2

ファイル アイコンの取得中に UI が応答しないという問題の 1 つは、解決されたようです。リモートマシンにあるファイルアイコンを取得しようとすると、時間がかかる可能性があるため、スタックしていました。そのため、同じ名前と拡張子でファイルを一時に作成し、icon = fw.getSystemIcon(f);その一時ファイルを呼び出してアイコンを my にレンダリングしましたJTable

import java.io.File;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.filechooser.FileSystemView;

/**
 *
 * @author admin
 */
public class MySwingWorker implements Runnable {

    private JLabel label;
    private String strFile;
    private Icon icon;

    public MySwingWorker(String strFile, JLabel label) {
        this.strFile = strFile;
        this.label = label;
    }

    @Override
    public void run() {

        File fTemp = new File(System.getProperty("pro.temp.home"), "Temp");
        if (fTemp.exists() == false) {
            try {
                fTemp.mkdirs();
            } catch (Exception ex) {
                //ignored
            }
        }
        File f = new File(fTemp, strFile);
        FileSystemView fw = FileSystemView.getFileSystemView();
        try {
            if (!f.exists()) {
                f.createNewFile();
            }
            icon = fw.getSystemIcon(f);

            try {
                org.apache.commons.io.FileUtils.forceDelete(f);
            } catch (Exception ex) {
            }
        } catch (Exception e) {
            //ignore
        }
        // set a default icon in case if unable to get the icon
        if (icon == null) {
            f = new File(fTemp, String.valueOf("Hello.txt"));
            try {
                if (!f.exists()) {
                    f.createNewFile();
                }
                icon = fw.getSystemIcon(f);

                try {
                    org.apache.commons.io.FileUtils.forceDelete(f);
                } catch (Exception ex) {
                    //ignore
                }
            } catch (Exception e) {
                //ignore
            }
        }
        label.setIcon(icon);

    }
}
于 2013-09-18T13:27:18.433 に答える