【问题标题】:How to get the icon for a file extension or filetype without creating a temp file?如何在不创建临时文件的情况下获取文件扩展名或文件类型的图标?
【发布时间】:2011-12-15 14:01:58
【问题描述】:

我在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。

还有其他解决方案吗?

【问题讨论】:

  • 我把 Swing 标签改成了 SWT 标签
  • 为什么?发帖人明确表示他们不想使用 SWT。
  • 我将标签改回 SWING。引用自己的话:“……但我不想使用 SWT”
  • @kleopatra ..但至于 sun.* 类的层次结构。 (不寒而栗)即使在应用程序中也不使用它们也有很好的理由。没有安全管理员。
  • Shell 图标处理程序被允许查看文件,以便他们可以例如生成图像的缩略图以用作图标。如果没有通用的方法来为没有文件执行此操作,我会感到惊讶,例如正如他们在“打开方式”菜单中使用的那样,但它可能归结为自己解析注册表项并忽略已注册的 COM 处理程序。

标签: java file swing icons desktop


【解决方案1】:

Looks 就像你已经找到了实现它的方法一样,除非你想深入了解原生库等。

FileSystemView 内部使用Win32ShellFolder,所以它们基本相同。

我还挖掘了org.eclipse.swt.program.Programorg.eclipse.swt.internal.win32.OS 的源代码。然后,OS 类对 Icon 使用本机调用。在这一点上,除非你真的不能创建一个临时文件,否则我不会走这条路。

对于 JDIC,我只发现 http://kickjava.com/src/org/jdesktop/jdic/tray/internal/impl/WinTrayIconService.java.htm 进行了一些挖掘(可能不相关,但做了一些标志性的事情:D)。也称为原生。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的建议,但前两个选项仅在使用file.createNewFile() 创建在磁盘上file = new File("easyasabc.pdf") 文件对象之后才有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多