Java/JavaFX : Set Swing Icon for JavaFX label

标签 java javafx icons label

我正在尝试从文件 (.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/

相关文章:

java - Mongodb Epoch Date - java 映射

java - JTable 重复行

JavaFX - 为什么分数没有增加?

java - 如何从外部包资源导入 CSS 文件

ios - “添加到主屏幕”在 IOS 5 中不使用 apple-touch-icon

css - 为 MapboxGl 标记使用自定义字体和重新着色

ios - 当 iPad 处于横屏模式时 Swift 旋转图标

java - 如何使用套接字流在 BufferedReader 上设置超时

Java 还是 C++ 适用于我特定的基于代理的模型 (ABM)?

java - 无法在 JavaFX 中移动矩形?