JavaFX: गतिशील रूप से एरिया चार्ट सीरीज़ बनाने के लिए deserialize कैसे करें?
charts javafx-2 (1)
यह पूरा करने के कई तरीके हैं कुछ दूसरों की तुलना में तेज़ हैं मैं आपको एक सरल तरीके से दिखा सकता हूँ कि टीआई किया जा सकता है, लेकिन कृपया ध्यान दें कि कई हैं
यदि गति एक चिंता का विषय नहीं है, तो मुझे ऑब्जेक्ट को आधार64 पाठ में क्रमबद्ध करना पसंद है। इससे डीब के पाठ के रूप में आसपास के प्रेमी के लिए आसान और स्टोर किया जाता है। अगर मैं एक ऐसी परियोजना पर काम कर रहा था जिसके लिए बहुत सारे डेटा गति की ज़रूरत है, तो मैं इस दृष्टिकोण के साथ नहीं जा सकता।
1) ऑब्जेक्ट को एक byte[]
में serialize करने के लिए जावा धारावाहिककरण का उपयोग करें 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();
}
}
इन तरीकों का उपयोग जावा ऑब्जेक्ट्स को कन्वर्ट करने के लिए ऑब्जेक्ट्स को बाइट में और बाहर कन्वर्ट करने के लिए इस्तेमाल किया जा सकता है []
2) बाइट को चरण 1 से लें और इसे बेस 64 टेक्स्ट में सीरियल कर लें। ये दो विधियां आपकी seriesContainer
को बेस 64 स्ट्रिंग में बदल देगी, या बेस 64 स्टिंग को seriesContainer
में बदल 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 से लें और इसे डीबी में रखें, या इसे डीबी से पढ़ें।
मैं क्षेत्र चार्ट में सूची का उपयोग करके गतिशील रूप से श्रृंखला जोड़ रहा हूं। मैं श्रृंखला को खोलना चाहता हूं मुझे इसकी आवश्यकता है क्योंकि मैं डीबी में एरिया चार्ट सीरीज़ डेटा को सहेजना चाहता हूं।
जब ऐप निष्पादित करता है तो यह ऐसा होता है:
उपयोगकर्ता पाठ फ़ील्ड भरकर और जोड़ें बटन पर क्लिक करके श्रृंखला जोड़ सकते हैं:
मैं चाहता हूं कि जब उपयोगकर्ता सहेजें बटन पर क्लिक करे, तो पहले से ही जोड़ दी गई श्रृंखला का डेटा में अनुवाद करना चाहिए ताकि मैं इसे डीबी में संग्रहीत कर सकूं। लेकिन मैंने इसे करने की कोशिश की है यह मुझे सटीक डेटा नहीं दे रहा है चैट पर श्रृंखला के अनुसार मैं इस तरह से उत्पादन प्राप्त करना चाहता हूं:
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");
}
}
FXML
<?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>
कृपया मुझे मार्गदर्शन करें कि मैं इसका समाधान कैसे कर सकता हूं और कृपया मुझे एच 2 डीबी में इस डेटा को कैसे स्टोर कर सकते हैं, कुछ मार्गदर्शन की आवश्यकता है। मैं स्प्रिंग बूट के साथ JavaFX का उपयोग कर रहा हूं