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

3

我需要一份完整的 UNC 路径上所有文件的列表。使用 java.io.File.listFiles() 方法列出的文件非常慢。我的应用程序在尝试使用 FileSystemView.getSystemIcon 获取文件图标以将其呈现到 JTable 时也卡住了。当我在 run 方法下评论特定代码时,它不会卡住。如何摆脱这个问题?

  • 问题必须在您的接收方的某个地方:-)

  • 类似的渲染器概念(JList 和 JTable 之间没有显着变化),

  • 查看MsExcellMsAccess*.ini file图标,这些图标正确呈现在JList

在此处输入图像描述

从代码

import java.awt.*;
import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.FileSystemView;

public class FilesInTheJList {

    private static final int COLUMNS = 5;
    private Dimension size;

    public FilesInTheJList() {
        final JList list = new JList(new File("C:\\").listFiles()) {

            private static final long serialVersionUID = 1L;

            @Override
            public Dimension getPreferredScrollableViewportSize() {
                if (size != null) {
                    return new Dimension(size);
                }
                return super.getPreferredScrollableViewportSize();
            }
        };
        list.setFixedCellHeight(50);
        list.setFixedCellWidth(150);
        size = list.getPreferredScrollableViewportSize();
        size.width *= COLUMNS;
        list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        list.setCellRenderer(new MyCellRenderer());
        list.setVisibleRowCount(0);
        list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
        JFrame f = new JFrame("Files In the JList");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new JScrollPane(list));
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                FilesInTheJList fITJL = new FilesInTheJList();
            }
        });
    }

    private static class MyCellRenderer extends JLabel implements ListCellRenderer {

        private static final long serialVersionUID = 1L;

        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            if (value instanceof File) {
                File file = (File) value;
                setText(file.getName());
                setIcon(FileSystemView.getFileSystemView().getSystemIcon(file));
                if (isSelected) {
                    setBackground(list.getSelectionBackground());
                    setForeground(list.getSelectionForeground());
                } else {
                    setBackground(list.getBackground());
                    setForeground(list.getForeground());
                }
                setPreferredSize(new Dimension(250, 25));
                setEnabled(list.isEnabled());
                setFont(list.getFont());
                setOpaque(true);
            }
            return this;
        }
    }
}
于 2013-09-18T08:24:21.290 回答
3

作为一个实际问题,具体实现FileSystemView可能会泄漏宿主平台管理的资源。相反,创建一个实例并在您的渲染器中使用它的图标,如此此处所示。

图片

于 2013-09-18T09:12:16.113 回答
2

我的一个问题是,在获取文件图标时 UI 没有响应,看起来它已经解决了。它被卡住了,因为它可能需要时间,当它试图获取远程计算机上的文件图标时。因此,我已将文件创建到具有相同名称和扩展名的临时文件中,并调用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 回答