可以将JavaFX UI图标写入/保存在文件中,以后再取回吗?

时间:2019-01-31 06:58:07

标签: java javafx serialization

我正在使用JavaFX创建一个像Scratch这样的儿童编程平台。我有一系列命令,当我单击它们时,它们输入我的“ CodeBox”,它扩展了标准JavaFX类VBox。当然,我想在代码中添加“保存”和“恢复”功能。但是由于JavaFX对象不是Serializable,所以我面临着深重的麻烦。

要尝试,我扩展了JavaFX Button类

public class fButton extends Button implements Serializable{

并添加了另一个命令将该fButton对象保存到文件中,并且该文件似乎已写入(在UTF-8中):

�� sr fButton׏aDN�� D 	orgSceneXD 	orgSceneYD 
orgTranslateXD 
orgTranslateYxp                                

我还有另一个命令从文件读取fButton并将其添加到现有的VBox中。执行该命令时,似乎添加了一个空按钮,其中不包含fButton的文本或任何其他属性。

现在我想知道是否有任何方法可以保存和检索所有这些对象,或者是否有更好的方法。

为方便起见,我使用的是JDK9.0.4和IntelliJ IDEA Ultimate 2018.3.。感谢您的考虑。

3 个答案:

答案 0 :(得分:4)

  

现在我想知道是否有任何方法可以保存和检索所有这些对象,或者是否有更好的方法。

序列化UI组件以保存状态通常是一种非常糟糕的方法,因为它会在UI和应用程序状态之间形成疯狂紧密耦合。

如果要在将来的版本中将VBox换成自定义StackPane组件怎么办?这是一个非常现实的场景-也许您想例如通过覆盖一些其他组件来装饰这些VBoxes-但这样做立即会破坏任何人的能力,然后再加载以前版本中保存的文件。

我认为您的后端状态应该与UI完全分开-然后,您可以通过任何您喜欢的方式(JSON,XML,其他Java序列化程序等)单独序列化后端状态,并依赖于渲染/转换器层为您的后端状态创建相关组件。

然后将两者分离,允许进行任何所需的序列化,并为更改UI层提供更多的空间,而不会过多地破坏后端模型。

答案 1 :(得分:1)

对于保存和加载,我建议使用JSON或XML文件。有一个单独的图像文件夹。保存文件时,请保存图像文件路径。然后可以在加载时附加图像或文本。

@Override
    protected void onNewIntent(Intent intent) {
       ......
    }

答案 2 :(得分:1)

Button不可序列化,并且不能从其继承,并且实现Serializable不可使其可序列化。那么在反序列化fButton时会发生什么?

  • 位于序列化处:JVM仅忽略继承字段的值并序列化默认值。在您的情况下,这可能意味着所使用的String被序列化为null

  • 反序列化中的
  • :JVM为不可序列化的继承类调用no-arg构造函数。在您的情况下,这可能意味着Button会以空字符串作为标签进行初始化。

如果您想控制序列化,请阅读内部/外部序列化以获得更好的控制。在您的情况下,请勿依赖默认序列化。