如何在不创建临时文件的情况下获取文件扩展名或文件类型的图标?

我在JTable列出了一些带有图标的文件名(如Windows资源管理器中的那些)。 如果我有一个来自本地文件系统的File对象,我知道获取图标的两种方法:

 javax.swing.filechooser.FileSystemView.getFileSystemView().getSystemIcon( file ) 

对于16×16图标或更大的图标:

 sun.awt.shell.ShellFolder.getShellFolder( file ).getIcon( true ) ) 

由于我的文件存储在数据库中,因此我没有File对象。 我的解决方法是创建具有特定文件扩展名的临时文件,使用上述两种方法之一并缓存该图标以在CellRenderer中显示它。

我搜索了没有临时文件的解决方案,发现了两个我不喜欢的解决方案:

  • org.eclipse.swt.program.Program.findProgram(String extension).getImageData() ,但我不想使用SWT
  • 来自JDIC项目的孵化器的org.jdesktop.jdic.icons.IconService 。 IconService的最后一次更改是6年前,在2年前的JDIC上,我找不到可下载的jar。

还有其他解决方案吗?

看起来你已经发现了这样做的方法,除非你想深入了解本地库等。

FileSystemView 在内部使用Win32ShellFolder,因此它们基本相同。

我还挖掘了org.eclipse.swt.program.Program的Source以及org.eclipse.swt.internal.win32.OS 。 然后OS类使用Icon的本机调用。 此时,除非你真的无法创建临时文件,否则我不会走那条路。

对于JDIC,我只找到了http://kickjava.com/src/org/jdesktop/jdic/tray/internal/impl/WinTrayIconService.java.htm并进行了一些挖掘(可能没有相关但是做了很多事情:D) 。 也称为原生。

你真的需要临时文件来使用第一个选项吗? 文件不必表示实际存在的文件……