序列化JavaFX组件

时间:2012-06-14 13:18:49

标签: java serialization user-interface javafx

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

保存关于某些位置上掉落的所有对象的信息非常重要。

我决定为此目的使用序列化。但是我无法序列化JavaFX组件。我试图序列化Buttons,Scenes,Stages,JFXPane,但似乎没什么用(我获得了NotSerializableException)。

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

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

非常感谢你的回答:)

2 个答案:

答案 0 :(得分:4)

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

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

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

有一个forum discussion序列化为FXML。

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

答案 1 :(得分:3)

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

/* 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> 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;
}
}