JavaFX example to update LineChart: user enter new data to the LineChart associated series, and remove the oldest item from the series. I tried three approachs to achieve the goal. The first one is obviously wrong. Check the code to know my implement.
package javafx_linechart;
import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_LineChart extends Application {
Label label1, label2, label3;
XYChart.Series series1, series2, series3;
final int MAX_NUM = 10;
@Override
public void start(Stage primaryStage) {
TextField textField = new TextField();
Button btn = new Button();
btn.setText("Add item");
btn.setOnAction((ActionEvent event) -> {
try{
int i = Integer.parseInt(textField.getText());
System.out.println(String.valueOf(i));
removeAndAdd(series1, i);
reduceSeriesXValue(series2, i);
shiftSeriesYValue(series3, i);
printSeries(series1, label1);
printSeries(series2, label2);
printSeries(series3, label3);
}catch (NumberFormatException ex){
System.out.println(ex.toString());
}
});
label1 = new Label();
label2 = new Label();
label3 = new Label();
//prepare LineChart 1
final NumberAxis xAxis1 = new NumberAxis();
final NumberAxis yAxis1 = new NumberAxis();
final LineChart<Number,Number> lineChart1 =
new LineChart<>(xAxis1,yAxis1);
series1 = new XYChart.Series();
series1.setName("series1");
lineChart1.getData().add(series1);
//prepare LineChart 2
final NumberAxis xAxis2 = new NumberAxis();
final NumberAxis yAxis2 = new NumberAxis();
final LineChart<Number,Number> lineChart2 =
new LineChart<>(xAxis2,yAxis2);
series2 = new XYChart.Series();
series2.setName("series2");
lineChart2.getData().add(series2);
//prepare LineChart 3
final NumberAxis xAxis3 = new NumberAxis();
final NumberAxis yAxis3 = new NumberAxis();
final LineChart<Number,Number> lineChart3 =
new LineChart<>(xAxis3,yAxis3);
series3 = new XYChart.Series();
series3.setName("series3");
lineChart3.getData().add(series3);
//init dummy data
for(int i=0; i<MAX_NUM; i++){
series1.getData().add(new XYChart.Data(i, i));
series2.getData().add(new XYChart.Data(i, i));
series3.getData().add(new XYChart.Data(i, i));
}
printSeries(series1, label1);
printSeries(series2, label2);
printSeries(series3, label3);
VBox vBox1 = new VBox();
vBox1.getChildren().addAll(lineChart1, label1);
VBox vBox2 = new VBox();
vBox2.getChildren().addAll(lineChart2, label2);
VBox vBox3 = new VBox();
vBox3.getChildren().addAll(lineChart3, label3);
HBox chartBox = new HBox();
chartBox.getChildren().addAll(vBox1, vBox2, vBox3);
CheckBox cbAnimated = new CheckBox("animated");
cbAnimated.setSelected(true);
cbAnimated.selectedProperty().addListener(
(ObservableValue<? extends Boolean> observable,
Boolean oldValue, Boolean newValue) -> {
lineChart1.setAnimated(newValue);
lineChart2.setAnimated(newValue);
lineChart3.setAnimated(newValue);
});
VBox vBox = new VBox();
vBox.getChildren().addAll(cbAnimated, textField, btn, chartBox);
StackPane root = new StackPane();
root.getChildren().add(vBox);
Scene scene = new Scene(root, 1000, 650);
primaryStage.setTitle("java-buddy.blogspot.com");
primaryStage.setScene(scene);
primaryStage.show();
}
//Remove the first item, and add the new item - WRONG result!
private void removeAndAdd(XYChart.Series series, int newValue){
series.getData().remove(0);
XYChart.Data newData =
new XYChart.Data(series.getData().size(), newValue);
series.getData().add(newData);
}
//remove the first item
//reduce XValue of all items by 1
//add the new item
public void reduceSeriesXValue(XYChart.Series series, int newValue){
series.getData().remove(0);
int numOfPoint = series.getData().size();
for(int i=0; i<numOfPoint; i++){
//reduce XValue
XYChart.Data<Number, Number> data =
(XYChart.Data<Number, Number>)series.getData().get(i);
int x = (int)data.getXValue();
data.setXValue(x-1);
}
series.getData().add(new XYChart.Data(numOfPoint, newValue));
}
//Shift all YValue
//add the new item
public void shiftSeriesYValue(XYChart.Series series, int newValue){
int numOfPoint = series.getData().size();
for(int i=0; i<numOfPoint-1; i++){
XYChart.Data<Number, Number> ShiftDataUp =
(XYChart.Data<Number, Number>)series.getData().get(i+1);
Number shiftValue = ShiftDataUp.getYValue();
XYChart.Data<Number, Number> ShiftDataDn =
(XYChart.Data<Number, Number>)series.getData().get(i);
ShiftDataDn.setYValue(shiftValue);
}
XYChart.Data<Number, Number> lastData =
(XYChart.Data<Number, Number>)series.getData().get(numOfPoint-1);
lastData.setYValue(newValue);
}
//display the data of series
private void printSeries(XYChart.Series series, Label label){
String printOut = "";
int numOfPoint = series.getData().size();
for(int i=0; i<numOfPoint; i++){
XYChart.Data<Number, Number> data =
(XYChart.Data<Number, Number>)series.getData().get(i);
printOut += i + " - " + data.getXValue()
+ " : " + data.getYValue() + "\n";
}
label.setText(printOut);
}
public static void main(String[] args) {
launch(args);
}
}

No comments:
Post a Comment