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