2017-05-31 7 views
1

jaxbとシリアライズを含むいくつかの方法を試しました。どちらも実際には機能しませんでした。ステージ/シーンのnodeには、richTextFXのLabel,BarChartCodeAreaが含まれています。シリアライズ方法については、私はjava.io.NotSerializableException: javafx.scene.chart.BarChartを取得します。シーンやステージをxmlなどのファイルに保存する方法はありますか(FXMLではなく)。その後、アプリケーションを閉じてもシーン/ステージを復元できます。どうもありがとう。Javafxはステージ/シーンをファイルに保存します

+2

実際のUIを保存するのではなく、*モデル*(アプリケーションが表示している基礎となるデータ)を保存することを検討する必要があります。 –

答えて

0

あなたのUI要素からのデータを保存する必要がありますJames_Dコメントを1として、あなた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のリストまたはマップを保持しておき、保存およびロード中にIDとして使用できます。

関連する問題