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

29

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

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

对于一个16x16像素的图标或者更大的图标:

sun.awt.shell.ShellFolder.getShellFolder( file ).getIcon( true ) )
由于我的文件存储在数据库中,因此我没有 File 对象。 我的解决方法是创建一个带有特定扩展名的临时文件,使用上述两种方法之一并缓存图标以在CellRenderer中显示它。
我搜索了一个无需使用临时文件的解决方案,但我也找到了另外两种我不喜欢的方法:
- org.eclipse.swt.program.Program.findProgram(String extension).getImageData() ,但我不想使用SWT。 - org.jdesktop.jdic.icons.IconService 来自 JDIC 项目的孵化器。 IconService的最后更改是6年前,JDIC 2年前,我找不到可下载的jar文件。
是否还有其他解决方法?

1
我将Swing标签更改为SWT标签。 - mKorbel
8
为什么?海报明确表示他们不想使用SWT。 - Edward Thomson
1
@kleopatra.. 但是关于 sun.* 类层次结构,(发抖)即使在没有安全管理器的应用程序中,也有非常好的理由不使用它们。 - Andrew Thompson
1
@AndrewThompson 我不反对 :-) - kleopatra
2
Shell图标处理程序允许查看文件,以便例如生成缩略图作为图标使用。如果没有一种通用的方法可以在没有文件的情况下执行此操作(例如在“打开方式”菜单中使用的方法),我会感到惊讶,但这可能归结于自己解析注册表条目并忽略已注册的COM处理程序。 - Rup
显示剩余5条评论
2个回答

4

看起来你已经找到了方法,除非你想深入研究本地库等。

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

我还挖掘出了org.eclipse.swt.program.Program 的源代码以及它的后台org.eclipse.swt.internal.win32.OS。然后, OS 类使用本地调用获取图标。在这一点上,除非你真的无法创建临时文件,否则我不会走这条路。

对于 JDIC,我只发现了http://kickjava.com/src/org/jdesktop/jdic/tray/internal/impl/WinTrayIconService.java.htm(也许与图标有关)经过一些挖掘,它也调用本地代码。


0

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


1
谢谢您的建议,但前两个选项只有在使用file.createNewFile()方法将file = new File("easyasabc.pdf")文件对象创建到磁盘上后才能起作用。 - bobndrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接