![](/img/trans.png)
[英]JavaFX: How to add serveral series dynimically on Area Chart and delete line(series) from chart?
[英]JavaFX: How to deserialize dynamically create Area Chart Series?
我正在使用面積圖中的列表動態添加序列。 我想拆開系列。 我需要這樣做,因為我想將面積圖系列數據保存在db中。
應用執行時如下所示:
用戶可以通過填充文本字段並單擊“添加”按鈕來添加系列:
我想要的是,當用戶單擊“保存”按鈕時,它應該將已經添加的系列轉換為數據,以便將其存儲在db中。 但是我嘗試過的操作並沒有給我准確的數據。 根據聊天系列,我想要這樣的輸出:
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<Number, Number> areaChart;
@FXML
private TextField txtSt;
@FXML
private TextField txtEt;
@FXML
private TextField txtNb;
LinkedList<XYChart.Series<Number, Number>> seriesContainer = new LinkedList<Series<Number, Number>>();
//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<Number, Number> 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<Number, Number> 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<Number, Number> 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");
}
}
XML文件
<?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>
請有人指導我如何解決此問題,並需要一些指導如何將數據存儲在H2 dB中。 我在Spring Boot中使用JavaFX。
有多種方法可以實現此目的。 有些比其他的快。 我將向您展示可以完成ti的一種簡單方法,但是請注意有幾種方法。
如果不關心速度,那么我想將對象序列化為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 []或轉換為byte []。
2)從第1步中獲取byte []並將其用於序列化為base64文本。 這兩個方法會將您的seriesContainer
轉換為base64 String,或者將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步中獲取字符串,並將其放入數據庫中,或從數據庫中讀取。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.