JavaFX:如何动态反序列化创建区域图系列?

我使用区域图中的列表动态添加系列。 我想打开这个系列。 我需要这个,因为我想在db中保存Area Chart系列数据。

当app执行时,它是这样的:

在此处输入图像描述

用户可以通过填写文本字段并单击“添加”按钮来添加系列:

在此处输入图像描述

在此处输入图像描述

我想要的是当用户点击“保存”按钮时,它应该将已添加的系列转换为数据,这样我就可以将其存储在数据库中。 但是我尝试过它并没有给我准确的数据。 根据聊天系列我想得到这样的输出:

Series 0 Employees: 5 Series 0 Start: 1 Series 0 End: 7 Series 1 Employees: 3 Series 1 Start: 9 Series 1 End: 12 

但是我得到了这个:

 Series 0 Employees: 5 Series 0 Start: 1 Series 0 End: 5 Series 1 Employees: 3 Series 1 Start: 10 Series 1 End: 5 

在此处输入图像描述

码:

 import java.net.URL; import java.util.LinkedList; import java.util.ResourceBundle; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.chart.AreaChart; import javafx.scene.chart.XYChart; import javafx.scene.chart.XYChart.Series; import javafx.scene.control.TextField; /** * * @author blj0011 */ public class SampleController implements Initializable { @FXML private AreaChart areaChart; @FXML private TextField txtSt; @FXML private TextField txtEt; @FXML private TextField txtNb; LinkedList<XYChart.Series> seriesContainer = new LinkedList<Series>(); //Button add functionality @FXML private void generateGraph() { Double start = Double.parseDouble(txtSt.getText()); Double end = Double.parseDouble(txtEt.getText()); double numberEmployees = Integer.parseInt(txtNb.getText()); XYChart.Series series= new XYChart.Series(); for (int i = start.intValue(); i <= end.intValue(); i++) { series.getData().add(new XYChart.Data(i, numberEmployees)); } // Add Series to series container. seriesContainer.add(series); //Add only new series to AreaChart for(XYChart.Series entry : seriesContainer) { if(!areaChart.getData().contains(entry)) { areaChart.getData().add(entry); entry.setName("XYChart.Series "+seriesContainer.size()); } } } //Button delete functionality @FXML private void deleteGraph() { } //Button Undo functionality @FXML private void undoGraph(){ } //Button Save functionality @FXML private void saveGraph(){ int max = 0; for(int i =0; i< seriesContainer.size(); i++){ XYChart.Series test = seriesContainer.get(i); System.out.println("Series "+i+" Employees: "+test.getData().get(i).getYValue().intValue()); System.out.println("Series "+i+" Start: "+test.getData().get(i).getXValue().intValue()); // find maximal y value int x = test.getData().get(i).getYValue().intValue(); if (x > max) { max = x; } System.out.println("Series "+i+" End: "+max); } } @Override public void initialize(URL location, ResourceBundle resources) { areaChart.setTitle("Chronos"); areaChart.getXAxis().setLabel("Heures"); areaChart.getYAxis().setLabel("Employés"); } } 

FXML

                           

请有人指导我如何解决这个问题,我需要一些指导如何以H2 dB存储这些数据。 我正在使用JavaFX和Spring Boot。

有多种方法可以实现这一目标。 有些比其他人快。 我将向您展示一个简单的方法,但请注意有几个。

如果速度不是我喜欢将对象序列化为base64文本。 这使得在文本中移动和存储在DB中非常容易。 如果我正在开发一个需要移动大量数据的项目,那么我可能不会采用这种方法。

1)使用Java序列化将对象序列化为byte[]

 protected byte[] convertToBytes(Object object) throws IOException { try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)) { out.writeObject(object); return bos.toByteArray(); } } protected Object convertFromBytes(byte[] bytes) throws IOException, ClassNotFoundException { try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInput in = new ObjectInputStream(bis)) { return in.readObject(); } } 

这些方法可用于转换Java对象以将对象转换为byte []。

2)从步骤1获取byte []并使用它序列化为base64文本。 这两个方法会将您的seriesContainer转换为base64 String,或者将base64 String转换为seriesContainer

 public String toBase64() { try { return Base64.getEncoder().encodeToString(convertToBytes(seriesContainer)); } catch (IOException ex) { throw new RuntimeException("Got exception while converting to bytes.", ex); } } public void initializeFromBase64(String b64) { byte[] bytes = Base64.getDecoder().decode(b64); try { this.seriesContainer = (LinkedList>) convertFromBytes(bytes); } catch (Exception ex) { throw new RuntimeException("Got exception while converting from bytes.", ex); } } 

3)从步骤2中取出字符串并将其放入DB中,或从DB中读取。