我使用区域图表中的列表动态添加系列。我想打开这个系列。我需要这个,因为我想在db。中保存Area Chart系列数据。
当app执行时,它是这样的:
用户可以通过填写文本字段并单击“添加”按钮来添加系列:
我想要的是当用户点击“保存”按钮时,它应该将已添加的系列转换为数据,这样我就可以将其存储在数据库中。但是我尝试过它并没有给我准确的数据。根据聊天系列,我想得到这样的输出:
<?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}}
代码:
{{1}}
FXML
{{1}}
请有人指导我如何解决这个问题,我需要一些指导如何以H2 dB存储这些数据。我正在使用JavaFX和Spring Boot。
答案 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中取出字符串并将其放入数据库,或从数据库中读取。