有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何绘制javax。摆动将ImageIcon转换为JavaFX。fxml呈现用户界面?

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

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

以下是转换方法的代码,基于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有一个SwingToolkitImage),因此它可能不适用于许多:

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

共 (1) 个答案

  1. # 1 楼答案

    您是否尝试过:

    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;
            }
        }
    
    }