我正在使用JavaFX XYChart程序编写快速图表应用程序。我希望XYChart代码生成绘图的实时更新。根据我的理解,一种方法可以使用并发或队列。下面是一个JavaFX XYChart的示例,您能否提供有关如何使其成为XY图的实时(移动)更新的建议?
Assets.xcassets
答案 0 :(得分:1)
虽然由于这些解决方案受到严重污染,但我创建了一个更简约的例子:
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线程中添加数据。