实时JavaFX XYChart

时间:2016-03-04 11:05:15

标签: javafx real-time updates

我正在使用JavaFX XYChart程序编写快速图表应用程序。我希望XYChart代码生成绘图的实时更新。根据我的理解,一种方法可以使用并发或队列。下面是一个JavaFX XYChart的示例,您能否提供有关如何使其成为XY图的实时(移动)更新的建议?

Assets.xcassets

1 个答案:

答案 0 :(得分:1)

可能重复:Line Chart Live update

虽然由于这些解决方案受到严重污染,但我创建了一个更简约的例子:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;

import java.util.concurrent.atomic.AtomicInteger;

public class Main extends Application {

  private AtomicInteger tick = new AtomicInteger(0);

  @Override
  public void start(Stage stage) {
    final NumberAxis xAxis = new NumberAxis();
    final NumberAxis yAxis = new NumberAxis();

    xAxis.setAnimated(false);
    xAxis.setLabel("Tick");

    yAxis.setAnimated(false);
    yAxis.setLabel("Value");

    XYChart.Series<Number, Number> series = new XYChart.Series<>();
    series.setName("Values");

    LineChart<Number, Number> chart = new LineChart<>(xAxis, yAxis);
    chart.setAnimated(false);
    chart.getData().add(series);

    Scene scene = new Scene(chart, 620, 350);
    stage.setScene(scene);
    stage.show();

    Thread updateThread = new Thread(() -> {
      while (true) {
        try {
          Thread.sleep(1000);
          Platform.runLater(() -> series.getData().add(new XYChart.Data<>(tick.incrementAndGet(), (int) (Math.random() * 100))));
        } catch (InterruptedException e) {
          throw new RuntimeException(e);
        }
      }
    });
    updateThread.setDaemon(true);
    updateThread.start();
  }

  public static void main(String[] args) {
    launch(args);
  }
}

图表的数据是一个可观察的列表,因此您可以从任何地方添加数据,它将自动更新。只需确保在UI线程中添加数据。