如何将 javax.swing.ImageIcon 绘制到 JavaFX .fxml 呈现的用户界面中?
How do I paint a javax.swing.ImageIcon into a JavaFX .fxml rendered User Interface?
我正在开发一个使用传统资源提供程序的 JavaFX 富客户端。此类提供的资源之一是 javax.swing.ImageIcon
。我必须在从 JavaFX .fxml 文件呈现的详细信息对话框中绘制该图标。
我发现的工作方式是使用 ImageIcon.paintIcon()
方法和 BufferedImage.createGraphics()
中的 java.awt.Graphics
将 ImageIcon
绘制成 java.awt.image.BufferedImage
。从 BufferedImage
、javafx.embed.swing.SwingFXUtils.toFXImage()
给出一个 javafx.scene.image.WritableImage
可以放在 .fxml 的 ImageView
中。
这里是转换方法的代码,基于在 Whosebug 中查看的其他一些解决方案:
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();
这是否有效取决于 ImageIcons 在您的遗留代码中的构造方式。这是一个工作示例。它还包含不起作用的注释掉的变体。
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 富客户端。此类提供的资源之一是 javax.swing.ImageIcon
。我必须在从 JavaFX .fxml 文件呈现的详细信息对话框中绘制该图标。
我发现的工作方式是使用 ImageIcon.paintIcon()
方法和 BufferedImage.createGraphics()
中的 java.awt.Graphics
将 ImageIcon
绘制成 java.awt.image.BufferedImage
。从 BufferedImage
、javafx.embed.swing.SwingFXUtils.toFXImage()
给出一个 javafx.scene.image.WritableImage
可以放在 .fxml 的 ImageView
中。
这里是转换方法的代码,基于在 Whosebug 中查看的其他一些解决方案:
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();
这是否有效取决于 ImageIcons 在您的遗留代码中的构造方式。这是一个工作示例。它还包含不起作用的注释掉的变体。
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;
}
}
}