序列化JavaFX组件

我正在尝试在Java FX下开发一个小拖放应用程序。 用户将在某些位置删除按钮,菜单,标签等JFX组件。 完成后,他将保存此布局,稍后他将重新打开布局,他将再次使用它。

存储有关放在某个位置的所有对象的信息非常重要。

我决定为此目的使用序列化。 但是我无法序列化JavaFX组件。 我试图序列化按钮,场景,阶段,JFXPane但似乎没有任何工作(我获得了NotSerializableException)。

有关如何保存所有组件然后检索它们的任何建议?

PS:我试图用FXML找出一些方法,但我没有成功。

非常感谢你的答案:)

如果在服务器端保存用户组件的主要目标是有可能向用户显示相同的界面 – 为什么不保存所有关于用户组件的描述性信息,以及何时需要 – 只需重建用户界面再次,使用存储的描述性信息? 这是原始的例子:

/* That is the class for storing information, which you need from your components*/ public class DropedComponentsCoordinates implements Serializable{ private String componentID; private String x_coord; private String y_coord; //and so on, whatever you need to get from yor serializable objects; //getters and setters are assumed but not typed here. } /* I assume a variant with using FXML. If you don't - the main idea does not change*/ public class YourController implements Initializable { List dropedComponentsCoordinates; @Override public void initialize(URL url, ResourceBundle rb) { dropedComponentsCoordinates = new ArrayList(); } //This function will be fired, every time //a user has dropped a component on the place he/she wants public void OnDropFired(ActionEvent event) { try { //getting the info we need from components String componentID = getComponentID(event); String component_xCoord = getComponent_xCoord(event); String component_yCoord = getComponent_yCoord(event); //putting this info to the list DropedComponentsCoordinates dcc = new DropedComponentsCoordinates(); dcc.setX_Coord(component_xCoord); dcc.setY_Coord(component_yCoord); dcc.setComponentID(componentID); } catch (Exception e) { e.printStackTrace(); } } private String getComponentID(ActionEvent event){ String componentID; /*getting cpmponentID*/ return componentID; } private String getComponent_xCoord(ActionEvent event){ String component_xCoord; /*getting component_xCoord*/ return component_xCoord; } private String getComponent_yCoord(ActionEvent event){ String component_yCoord; /*getting component_yCoord*/ return component_yCoord; } } 

您是对的,JavaFX(从2.1开始)不支持使用Java Serializable接口对组件进行序列化 – 因此您无法使用该机制。

JavaFX可以使用FXMLLoader.load()方法从FXML文档反序列化。

但是,技巧是如何编写现有组件并向FXML说明?

关于序列化到FXML的论坛讨论 。

目前,执行FXML序列化的平台没有任何公开信息。 显然,创建一个通用的scenegraph => FXML序列化器是一项非常复杂的任务(并且我知道没有公共第三方API)。 迭代场景图并为一组有限的组件和属性写出FXML并不是太困难。