如何将javax.swing.ImageIcon绘制到JavaFX.fxml呈现的用户界面中?

如何将javax.swing.ImageIcon绘制到JavaFX.fxml呈现的用户界面中?,java,swing,javafx-8,fxml,Java,Swing,Javafx 8,Fxml,我正在开发一个使用遗留资源提供者的JavaFX富客户端。提供的一个这样的资源是javax.swing.ImageIcon。我必须在从JavaFX.fxml文件呈现的详细信息对话框中绘制该图标 我发现的工作方法是使用ImageIcon.paintIcon()方法和java.awt.Graphics从BufferedImage.createGraphics()将ImageIcon绘制成java.awt.image.BufferedImage。从这个buffereImage,javafx.embed.

我正在开发一个使用遗留资源提供者的JavaFX富客户端。提供的一个这样的资源是
javax.swing.ImageIcon
。我必须在从JavaFX.fxml文件呈现的详细信息对话框中绘制该图标

我发现的工作方法是使用
ImageIcon.paintIcon()
方法和
java.awt.Graphics
BufferedImage.createGraphics()
ImageIcon
绘制成
java.awt.image.BufferedImage
。从这个
buffereImage
javafx.embed.swing.SwingFXUtils.toFXImage()
给出了一个
javafx.scene.image.WritableImage
,可以放在.fxml的
ImageView

以下是转换方法的代码,基于StackOverflow中查看的一些其他解决方案:

private javafx.scene.image.Image atonIcon2ImageConverter(ImageIcon icon) {
    BufferedImage bi = new BufferedImage(
            icon.getIconWidth(),
            icon.getIconHeight(),
            BufferedImage.TYPE_INT_RGB);

    Graphics g = bi.createGraphics();
    // paint the Icon to the BufferedImage.
    icon.paintIcon(null, g, 0, 0);
    g.dispose();
    return SwingFXUtils.toFXImage(bi.getSubimage(0, 1, bi.getWidth(), bi.getHeight()-1), null);
}
虽然这个解决方案是可行的,但在我看来它相当复杂,我想听听专家们对如何让它变得更简单的看法。由于JavaFX是Swing的继承者,我认为很有可能有一种更简单的方法将Swing
ImageIcon
放置在JavaFX.fxml文件中(给出了
ImageIcon
,但是
ImageView
可能会受到质疑)

编辑:我的解决方案。 在尝试并混合了不同的评论和解决方案之后,下面是我为我的真实系统实现所做的。它肯定是一个非常特殊的环境(
ImageIcon
内部有一个Swing
ToolkitImage
),因此它可能不适用于许多:

private javafx.scene.image.Image atonIcon2ImageConverter(ImageIcon icon) {
    BufferedImage bi = ((sun.awt.image.ToolkitImage)imageIcon.getImage()).getBufferedImage();
    return SwingFXUtils.toFXImage(bi, null);
}
您是否尝试过:

ImageIcon imageIcon;
Image image = imageIcon.getImage();
BufferedImage bufferedImage = (BufferedImage) image;
或结合

BufferedImage bufferedImage = (BufferedImage) imageIcon.getImage();
这是否有效取决于图像图标在遗留代码中的构造方式。下面是一个工作示例。它还包含注释掉的变量,该变量不起作用

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class ImageIconTest {

    public static void main(String[] args) throws IOException {
        ImageIcon imageIcon = createImageIcon("/DukeCheers.png", "DukeCheers");

        BufferedImage bufferedImage = (BufferedImage)imageIcon.getImage();

        System.out.println("done");
    }

    private static ImageIcon createImageIcon(String path, String description) throws IOException {
        java.net.URL imgURL = ImageIconTest.class.getResource(path);
        if (imgURL != null) {

            // This does not work.
            // return new ImageIcon(imgURL, description);

            // This works.
            return new ImageIcon(ImageIO.read(imgURL), description);

        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }

}

“JavaFX是Swing的继承者”是这样吗?我听过程序员偶尔这样说,但从未作为(Sun或)Oracle的官方声明。@AndrewThompson你和我完全一样。我曾在几处地方读到“主流公众并不认为JavaFX2是Swing的继任者,但JavaFX8的到来确实提供了一个很好的候选者。”我对JavaFX不熟悉,所以我不会发表绝对的声明。我的希望是欺骗任何“非常接近JavaFX开发”的人,让他们回答不是这样的,或者是这样的,这个特定的问题就这样解决了。回答得很好。;)好的,现在回到它。首先,为什么需要将Swing图标转换为JavaFX图标?第二,如果Java FX有一个内置图标,可以接受包含图像的输入流,为什么不将基于AWT的
BuffereImage
转换为流呢?@andreThompson:对于第一个问题,我的原始问题是答案:我需要在.fxml呈现的GUI中显示从遗留系统获得的图像图标;我不确定该怎么做,但我提到的管道就是我发现有效的管道。第二个问题:“这个想法我还没有尝试过。”它现在在我的队列中——这是我的空闲时间,因为我丑陋的解决方案奏效了,并且被项目接受了。@AndrewThompson:但是这个想法很吸引人,让我尝试了不同的事情。我确实在你的评论中发现了一些“信号”,它是有效的。现在整个过程仍然简化为两行:
BufferedImage bi=((sun.awt.image.ToolkitImage)imageIcon.getImage()).getBufferedImage()
javafx.scene.image.image img=SwingFXUtils.toFXImage(bi.getSubimage(0,0,bi.getWidth(),bi.getHeight()),null)谢谢你的提示。如果你觉得这个答案值得,你可以重写一下。