按James_D评论,你应该从你的UI元素保存数据不元素themselves'cos你有他们已编码,右)
的我做它的方式一小片段:
public class SaveRestoreDemo extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Save/restore demo");
Group root = new Group();
Scene scene = new Scene(root, 600, 250, Color.WHITE);
BorderPane borderPane = new BorderPane();
borderPane.prefHeightProperty().bind(scene.heightProperty());
borderPane.prefWidthProperty().bind(scene.widthProperty());
VBox box = new VBox(10);
TextArea area = new TextArea();
area.setId("textArea");
TextField field = new TextField();
field.setId("field");
box.getChildren().addAll(area, field);
borderPane.setTop(getMainMenuContainer(box.getChildren()));
borderPane.setCenter(box);
root.getChildren().add(borderPane);
primaryStage.setScene(scene);
primaryStage.show();
}
private VBox getMainMenuContainer(ObservableList<Node> children) {
VBox topContainer = new VBox();
MenuBar mainMenu = new MenuBar();
topContainer.getChildren().add(mainMenu);
Menu menu = new Menu("Menu");
MenuItem load = new MenuItem("Load");
load.setOnAction(e -> load(children));
MenuItem save = new MenuItem("Save");
save.setOnAction(e -> save(children));
menu.getItems().addAll(save, load);
mainMenu.getMenus().add(menu);
return topContainer;
}
private void load(ObservableList<Node> children) {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Load file");
File file = fileChooser.showOpenDialog(new Stage());
if (file != null) {
try {
Values values = new Gson().fromJson(org.apache.commons.io.FileUtils.readFileToString(file, StandardCharsets.UTF_8), Values.class);
children.stream().filter(child -> child.getId() != null)
.forEach(child -> {
if (child instanceof TextField) {
TextField field = (TextField) child;
field.setText(values.getFieldText());
} else if (child instanceof TextArea) {
TextArea area = (TextArea) child;
area.setText(values.getAreaText());
}
});
} catch (IOException e) {
// handle properly
}
}
}
private void save(ObservableList<Node> children) {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Save file");
File file = fileChooser.showSaveDialog(new Stage());
if (file != null) {
Values values = new Values();
children.stream().filter(child -> child.getId() != null)
.forEach(child -> {
if (child instanceof TextField) {
TextField field = (TextField) child;
values.setFieldText(field.getText());
} else if (child instanceof TextArea) {
TextArea area = (TextArea) child;
values.setAreaText(area.getText());
}
});
try {
org.apache.commons.io.FileUtils.write(file, new Gson().toJson(values), StandardCharsets.UTF_8);
} catch (IOException e) {
// handle properly
}
}
}
private static class Values {
private String areaText;
private String fieldText;
public String getAreaText() {
return areaText;
}
public void setAreaText(String areaText) {
this.areaText = areaText;
}
public void setFieldText(String fieldText) {
this.fieldText = fieldText;
}
public String getFieldText() {
return fieldText;
}
}
}
基本上,我只是循环通过主容器的孩子,从他们那里收集值,然后使用Gson和Apache Commons保存到Json。 这个例子很简单,对于更复杂的保存\加载,你可以使用节点的id。例如,您可以保存ID列表或地图,然后在保存和加载时将它们用作标识符。
您应该考虑保存* model *(即应用程序显示的基础数据),而不是保存实际的UI。 –