我正在尝试从文件 (.ico/.exe) 中读取缩略图(图标;32x32 像素)并将其设置为 JavaFX 标签。
我的第一次尝试:
public Icon getLargeIcon(String exeFile) {
if (exeFile != null) {
File file = new File(exeFile);
try {
ShellFolder sf = ShellFolder.getShellFolder(file);
return new ImageIcon(sf.getIcon(true), sf.getFolderType());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
return null;
}
之后我这样做:
Icon largeIcon = getLargeIcon(file.getAbsolutePath());
ImageIcon swingImageIcon = (ImageIcon) largeIcon;
java.awt.Image awtImage = swingImageIcon.getImage();
Image fxImage = javafx.scene.image.Image.impl_fromPlatformImage(awtImage);
lblAppIconValue.setGraphic(new ImageView(fxImage));
我搜索了几个网站并找到了这个,但它给了我一个异常(exception):
java.lang.UnsupportedOperationException:loadPlatformImage 不支持的类
我的第二次尝试:
URL url = file.toURI().toURL();
Image image = new Image(url.toString());
lblAppIconValue.setGraphic(new ImageView(image));
同样不工作......
我的问题:如何将 javax.swing.Icon 设置为 JavaFX 标签?是否可以?如果不可能,我如何从文件中读取缩略图并将其设置为 JavaFX 标签的图标/图形?
谢谢!
最佳答案
切勿使用 impl_
方法:这些方法不是公共(public) API 的一部分。
要将 awt 图像转换为 FX 图像,javafx.embed.swing
中的 SwingFXUtils
类有一个 toFXImage(...)
将 BufferedImage
转换为 JavaFX Image
的方法。不清楚您从图标中获得的图像是否是 BufferedImage
,因此您需要执行几个步骤才能使其正常工作:
BufferedImage bImg ;
if (awtImage instanceof BufferedImage) {
bImg = (BufferedImage) awtImage ;
} else {
bImg = new BufferedImage(awtImage.getWidth(null), awtImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics = bImg.createGraphics();
graphics.drawImage(awtImage, 0, 0, null);
graphics.dispose();
}
Image fxImage = SwingFXUtils.toFXImage(bImg, null);
这是一种相当低效的方法,因为您首先从文件创建 awt 图像,然后可能通过中间缓冲图像将其转换为 FX 图像。如果您有权访问 ShellFolder
类的源代码,您可能会看到它如何实现 getIcon()
方法并遵循相同的过程。在某些时候,它必须得到一个包含图像数据的 InputStream
;一旦你有了它,你就可以将它传递给 javafx.scene.image.Image
构造函数。
关于Java/JavaFX : Set Swing Icon for JavaFX label,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26192832/