簡體   English   中英

Javafx將舞台/場景保存到文件中

[英]Javafx save a stage/scene into a file

我嘗試了幾種方法,包括jaxb和序列化。 兩者都沒有真正起作用。 node在階段/景S包括LabelBarChartCodeArea從richTextFX。 對於序列化方法,我得到java.io.NotSerializableException: javafx.scene.chart.BarChart 有沒有辦法將場景/舞台保存到文件,如xml(不是說FXML)? 然后,即使我關閉了應用程序,我也可以恢復場景/階段。 非常感謝。

根據James_D評論,你應該保存你的UI元素中的數據,而不是你已經編碼過的元素本身,對嗎?)

我做的方式的簡短片段:

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。 這個例子非常簡單,對於更復雜的save \\ loading,你可以使用節點的id。 例如,您可以保留id的列表或映射,然后在保存和加載時將它們用作標識符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM