我的JavaFX应用程序的一个用例是在一侧加载图像,在TCP套接字上对其进行序列化,以在另一侧将其显示为JavaFX图像。
为了实现这一点,我使用SwingFXUtils.fromFXImage()
和SwingFXUtils.toFXImage()
来创建和阅读可以序列化的BufferedImage
。
一切正常。但我想在覆盆子pi上运行显示侧。正如我发现的那样,ARM上的JavaFX中没有Swing组件的集成,因此在NoClassDefFoundError
上使用SwingFXUtils
时得到Raspi
。
请建议我如何在不使用SwingFXUtils
的情况下创建和阅读可序列化的图像对象?
答案 0 :(得分:1)
感谢您的回答。
@haraldK当然我在序列化之前已将BufferedImage
写入ByteArray
。我昨晚的解释还不够准确。 Mea culpa。
我找到了解决问题的方法:为了让它在Raspberry Pi上运行,我只需用BufferedImage
替换InputStream
来读取包含图像数据的ByteArray
。这允许我使用Image
创建JavaFX InputStream
对象,而不是使用SwingFXUtils
。
<强>之前:强>
BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(imageUpdate.getImageByteArray()));
imageView.setImage(SwingFXUtils.toFXImage(bufferedImage, null));
,其中imageUpdate
是用于通过TCP套接字进行数据传输的ImageUpdate
对象(包含图像和附加数据)。
如前所述,这会产生
Exception in thread "..." java.lang.NoClassDefFoundError: javafx/embed/swing/JFXPanel
在Raspberry Pi上,因为在ARM体系结构的JavaFX端口中缺少Swing类。
<强>后:强>
InputStream inputStream = new ByteArrayInputStream(imageUpdate.getImageByteArray());
imageView.setImage(new Image(inputStream));
这个解决方案现在就像我的Raspberry Pi上的魅力一样。
答案 1 :(得分:1)
缺少的类SwingFXUtils的源代码似乎位于:
它已获得GPL许可。我试过了,它可以在树莓派PI上工作