SwingFXUtils替代图像序列化(Javafx,Swing,Raspberry Pi)

时间:2018-06-17 22:23:45

标签: java swing javafx raspberry-pi arm

我的JavaFX应用程序的一个用例是在一侧加载图像,在TCP套接字上对其进行序列化,以在另一侧将其显示为JavaFX图像。

为了实现这一点,我使用SwingFXUtils.fromFXImage()SwingFXUtils.toFXImage()来创建和阅读可以序列化的BufferedImage

一切正常。但我想在覆盆子pi上运行显示侧。正如我发现的那样,ARM上的JavaFX中没有Swing组件的集成,因此在NoClassDefFoundError上使用SwingFXUtils时得到Raspi

请建议我如何在不使用SwingFXUtils的情况下创建和阅读可序列化的图像对象?

2 个答案:

答案 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的源代码似乎位于:

http://cr.openjdk.java.net/~ant/RT-37740/webrev.0/modules/swing/src/main/java/javafx/embed/swing/SwingFXUtils.java.html

它已获得GPL许可。我试过了,它可以在树莓派PI上工作