【发布时间】:2026-01-25 15:55:01
【问题描述】:
我正在 JavaFX 中构建一个 XYChart。它包含两个系列(系列 1 和 2)和第三系列(系列 3),其值应为系列 1 和 2 的总和。
现在,如果对系列 1 或 2 的值(添加、删除、更改等)进行了更改,系列 3 应该会自动更新。
实现这一目标的最佳方法是什么?
提前谢谢你。
package lineChart;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;
public class LineChartSample extends Application {
@Override
public void start(Stage stage) {
final NumberAxis xAxis = new NumberAxis();
final NumberAxis yAxis = new NumberAxis();
final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis);
XYChart.Series series1 = new XYChart.Series();
series1.getData().add(new XYChart.Data(1, 10));
series1.getData().add(new XYChart.Data(10, 20));
series1.getData().add(new XYChart.Data(20, 30));
lineChart.getData().add(series1);
XYChart.Series series2 = new XYChart.Series();
series2.getData().add(new XYChart.Data(1, 20));
series2.getData().add(new XYChart.Data(10, 30));
series2.getData().add(new XYChart.Data(20, 40));
lineChart.getData().add(series2);
XYChart.Series series3 = new XYChart.Series();
// series3 = series1 + series2
series3.getData().add(new XYChart.Data(1, 10 + 20));
series3.getData().add(new XYChart.Data(10, 20 + 30));
series3.getData().add(new XYChart.Data(20, 30 + 40));
lineChart.getData().add(series3);
Scene scene = new Scene(lineChart, 800, 600);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
更新 1 我已经更新了示例代码。如果我运行此代码,系列 3 会对从系列 1 或系列 2 添加或删除数据对象做出反应。但不幸的是,它不会对更改数据对象的值做出反应。
import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Data;
import javafx.stage.Stage;
public class LineChartSample extends Application {
private static int updateCounter = 1;
private XYChart.Series<Integer, Integer> series1, series2, series3;
@Override
public void start(Stage stage) {
final NumberAxis xAxis = new NumberAxis();
final NumberAxis yAxis = new NumberAxis();
final LineChart<Integer, Integer> lineChart = new LineChart(xAxis, yAxis);
series1 = new XYChart.Series<>();
series1.getData().add(new XYChart.Data(1, 10));
series1.getData().add(new XYChart.Data(10, 20));
series1.getData().add(new XYChart.Data(20, 30));
lineChart.getData().add(series1);
series2 = new XYChart.Series<>();
series2.getData().add(new XYChart.Data(1, 20));
series2.getData().add(new XYChart.Data(10, 30));
series2.getData().add(new XYChart.Data(20, 40));
lineChart.getData().add(series2);
series3 = new XYChart.Series<>();
lineChart.getData().add(series3);
bindDataSeieses();
Scene scene = new Scene(lineChart, 800, 600);
stage.setScene(scene);
stage.show();
// update 1
updateSumSeries();
// update 2
series1.getData().remove(0);
// update 3
series1.getData().add(new XYChart.Data(1, 50));
// No update :-(
series1.getData().get(0).setYValue(200);
}
private void bindDataSeieses() {
series1.getData().addListener((ListChangeListener<Data<Integer, Integer>>) c -> updateSumSeries());
series2.getData().addListener((ListChangeListener<Data<Integer, Integer>>) c -> updateSumSeries());
}
private void updateSumSeries() {
System.out.println("Update " + updateCounter++);
// todo enhance to support series of different length
if (series1.getData().size() != series2.getData().size())
return;
series3.getData().clear();
for (int index = 0; index < series1.getData().size(); index++) {
int xValue = series1.getData().get(index).getXValue();
int yValue = series1.getData().get(index).getYValue() + series2.getData().get(index).getYValue();
series3.getData().add(new Data<>(xValue, yValue));
}
}
public static void main(String[] args) {
launch(args);
}
}
【问题讨论】:
-
我不明白为什么你不能得到两个系列,将它们相加,然后将它们添加到第三个系列中。
-
如果系列 1 或 2 的值发生更改(添加、删除、更改等),系列 3 应该会自动更新。
-
你是如何修改数据的?
-
实际上我通过拖动图表中绘制的系列的节点来更改数据。示例代码中并没有让它尽可能简单。
-
在回答问题后修改问题不是一个好习惯。
标签: java javafx charts binding series