Я разрабатываю полнофункциональный клиент JavaFX , который использует устаревшие поставщики ресурсов. Одним из таких предоставленных ресурсов является javax.swing.ImageIcon
. Мне нужно нарисовать этот значок внутри диалогового окна с деталями, которое отображается из файла JavaFX .f xml.
Я обнаружил, что для работы нужно нарисовать ImageIcon
в java.awt.image.BufferedImage
с помощью ImageIcon.paintIcon()
метод с java.awt.Graphics
из BufferedImage.createGraphics()
. Исходя из этого BufferedImage
, javafx.embed.swing.SwingFXUtils.toFXImage()
дает javafx.scene.image.WritableImage
, который может быть помещен в ImageView
файла .f xml.
Вот код метода преобразования, основанный на другом решения, рассматриваемые здесь, в 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 .f xml (дается 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);
}