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

时间:2017-08-27 00:51:41

标签: java javafx charts javafx-2 javafx-8

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

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

enter image description here

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

enter image description here

enter image description here

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

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.chart.AreaChart?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>

<VBox alignment="CENTER" prefHeight="800.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController">
   <children>
      <AreaChart fx:id="areaChart" prefHeight="799.0" prefWidth="800.0" VBox.vgrow="ALWAYS">
         <xAxis>
            <NumberAxis autoRanging="false" minorTickCount="1" minorTickLength="1.0" side="BOTTOM" tickLabelGap="1.0" tickLength="1.0" tickUnit="1.0" upperBound="24.0" fx:id="xAxis" />
         </xAxis>
         <yAxis>
            <NumberAxis fx:id="yAxis" autoRanging="false" minorTickLength="1.0" side="LEFT" tickLabelGap="1.0" tickUnit="1.0" upperBound="10.0" />
         </yAxis>
      </AreaChart>
      <HBox alignment="CENTER" prefHeight="193.0" prefWidth="800.0">
         <children>
            <TextField fx:id="txtSt" promptText="Start Value" />
            <TextField fx:id="txtEt" promptText="End Value" />
            <TextField fx:id="txtNb" promptText="Number of Employees" />
         </children>
      </HBox>
      <HBox alignment="CENTER" prefHeight="71.0" prefWidth="800.0">
         <children>
            <Button mnemonicParsing="false" onAction="#generateGraph" prefHeight="31.0" prefWidth="137.0" text="Add" />
            <Button layoutX="342.0" layoutY="12.0" mnemonicParsing="false" onAction="#deleteGraph" prefHeight="31.0" prefWidth="137.0" text="Delete" />
            <Button layoutX="410.0" layoutY="12.0" mnemonicParsing="false" onAction="#undoGraph" prefHeight="31.0" prefWidth="137.0" text="Undo" />
            <Button layoutX="479.0" layoutY="10.0" mnemonicParsing="false" onAction="#saveGraph" prefHeight="31.0" prefWidth="137.0" text="Save" />
         </children>
      </HBox>
   </children>
</VBox>

但我得到了这个:

{{1}}

enter image description here

代码:

{{1}}

FXML

{{1}}

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

1 个答案:

答案 0 :(得分:0)

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

如果速度不是我想要将对象序列化为base64文本的问题。这样可以很容易地将数据库作为文本移动并存储在数据库中。如果我正在开发一个需要移动大量数据的项目,那么我可能不会采用这种方法。

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字符串,或者将base64字符串转换为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<XYChart.Series<Number, Number>>) convertFromBytes(bytes);
    } catch (Exception ex) {
        throw new RuntimeException("Got exception while converting from bytes.", ex);
    }
}

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