在生成的文件列表中显示文件图标

时间:2010-08-14 03:12:34

标签: java swing

我想在Swing做一件事,我希望我能够清楚。

我想根据扩展名显示带有图标的文件列表,用户已将该图标与该特定文件相关联。但是,我希望在程序中生成这个文件列表 - 我的意思是:显示的文件图标将是文件夹中的实际文件(因此我无法使用JFileChooser )。

有什么能帮助我解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

嗨我在google搜索时偶然发现了这一点![替代文字] [1]这有助于:)

import java.io.*;
import javax.swing.*;

public class IconExtract1 {
public static void main(String[] args) throws Exception {
String s = "c:/windows/regedit.exe";
File file = new File(s);

// Get metadata and create an icon
sun.awt.shell.ShellFolder sf =
        sun.awt.shell.ShellFolder.getShellFolder(file);
Icon icon = new ImageIcon(sf.getIcon(true));
System.out.println("type = " + sf.getFolderType());

// show the icon
JLabel ficon = new JLabel(s, icon, SwingConstants.LEFT);
JFrame frame = new JFrame();
frame.getContentPane().add(ficon);
frame.pack();
frame.setVisible(true);
}
}
另一种方式:

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

public class IconExtract2 {
public static void main(String[] args) throws Exception {
String s = "c:/windows/regedit.exe";
File file = new File(s);

// Get metadata and create an icon
Icon icon = FileSystemView.getFileSystemView().getSystemIcon(file);

// show the icon
JLabel ficon = new JLabel(s, icon, SwingConstants.LEFT);

JFrame frame = new JFrame();
frame.getContentPane().add(ficon);
frame.pack();
frame.setVisible(true);
}
}

这是链接:http://www.rgagnon.com/javadetails/java-0439.html

答案 1 :(得分:1)

我刚刚想到的一个丑陋的黑客,我不知道它是否会起作用。

我可以创建一个临时文件夹,然后在其中放入具有相同文件名的空文件,然后在该文件夹上显示JFileChooser,然后在窗口关闭后删除该文件夹。

但我更喜欢“更清洁”的解决方案。

答案 2 :(得分:1)

行。这很好用。我从thisthis文章中提取了想法。

我的想法是,我创建了一个经典的JList,但我添加了一个自定义ListCellRenderer来绘制图标,这些图标是通过JFileChooser从临时文件中获取的。生成的渲染器看起来像这样(我将字段设为静态,因此每次创建JList时都不会重新创建它们):

package app;

import java.awt.Component;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
public class PseudofileIconRenderer extends DefaultListCellRenderer {

    private static HashMap<String, Icon> extIcons = new HashMap<String, Icon>();
    private static Pattern p = Pattern.compile("\\.\\w+$");
    private static JFileChooser chooser = new JFileChooser();

    @Override
    public Component getListCellRendererComponent(
        JList list, Object value, int index,
        boolean isSelected, boolean cellHasFocus) {


    JLabel label =
            (JLabel) super.getListCellRendererComponent(list,
            value, index, isSelected, cellHasFocus);


    String filename = (String) value;
    Matcher m = p.matcher(filename);
    Icon i;
    String extension = m.find() ? m.group() : "";
    if (extIcons.containsKey(extension)) {
        i = extIcons.get(extension);
    } else  {
        File file;
        try {
            file = File.createTempFile("icon", extension);
            file.deleteOnExit();

            i = chooser.getIcon(file);
            extIcons.put(extension, i);

        } catch (IOException ex) {
            //this shouldn't happen anyway
            i = null;
        }
    }

    label.setIcon(i);

    return label;
}

然后,我可以用JList填充代表文件的String