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

Java 在swing中显示生成的文件列表中的文件图标,java,swing,Java,Swing,我想在摇摆中做一件事,我希望我能说清楚 我想显示一个带有图标的文件列表,这些图标是用户根据扩展名与特定文件关联的。但是,我希望在程序中生成此文件列表—我的意思是:显示的文件图标将不是文件夹中的实际文件(因此我不能使用JFileChooser) 有什么能帮我解决这个问题吗?我刚才想到了一个难看的黑客,我不知道它是否有效 我可以创建一个临时文件夹,然后将具有相同文件名的空文件放入其中,然后在该文件夹上显示JFileChooser,然后在窗口关闭后删除该文件夹 不过,我更喜欢“更清洁”的解决方案。好的

我想在摇摆中做一件事,我希望我能说清楚

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


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

我刚才想到了一个难看的黑客,我不知道它是否有效

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


不过,我更喜欢“更清洁”的解决方案。

好的。这很有效。我从这篇文章中吸取了一些想法

其想法是,我创建了一个经典的
JList
,但我添加了一个自定义的
ListCellRenderer
来绘制图标,这些图标是通过
JFileChooser
从临时文件中提取的。生成的渲染器如下所示(我将字段设置为静态,因此不会在每次创建
JList
时重新创建字段):

package应用程序;
导入java.awt.Component;
导入java.io.File;
导入java.io.IOException;
导入java.util.HashMap;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
导入javax.swing.DefaultListCellRenderer;
导入javax.swing.Icon;
导入javax.swing.JFileChooser;
导入javax.swing.JLabel;
导入javax.swing.JList;
公共类PseudofileIconRenderer扩展了DefaultListCellRenderer{
私有静态HashMap extIcons=newhashmap();
私有静态模式p=Pattern.compile(“\\.\\w+$”;
私有静态JFileChooser chooser=新JFileChooser();
@凌驾
公共组件GetListCellRenderComponent(
JList列表、对象值、整数索引、,
布尔值(已选择,布尔单元格已聚焦){
JLabel标签=
(JLabel)super.getListCellRenderComponent(列表,
值、索引、isSelected、cellHasFocus);
字符串文件名=(字符串)值;
Matcher m=p.Matcher(文件名);
图标一;
字符串扩展名=m.find()?m.group():“”;
if(extIcons.containsKey(扩展)){
i=extIcons.get(扩展名);
}否则{
文件;
试一试{
file=file.createTempFile(“图标”,扩展名);
deleteOnExit()文件;
i=chooser.getIcon(文件);
extIcons.put(扩展名,i);
}捕获(IOEX异常){
//无论如何,这不应该发生
i=零;
}
}
标签.设置图标(i);
退货标签;
}

然后,我可以在
JList
中填入表示文件的
String
s。

嗨,我在谷歌搜索时遇到了这个问题……hop![alt text][1]e这有助于:)

另一种方式:

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

这是链接:

Hmmm,我想知道如何在给定的操作系统上找到与文件关联的图标。问得好。哦,对不起,我看错了。出于某种原因,这在OS X中不起作用-它为每个文件返回相同的图标。我自己的答案中的解决方案在那里有效。
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);
}
}