我是新来的JavaFX,但我不是新来的Java。 我有一个大的复杂的系统,它产生在一个循环的一些结果。 我试图实现的是绘制一个JavaFX图表上每个迭代的结果。 我是用java的jfreechart的图书馆没有问题这样做,但我现在想切换到JavaFX的。 图表看起来更看中和我喜欢的方式风格的处理。 无论如何,我挣扎着试图了解如何点JavaFX应用程序添加到XYChart.Series对象。 Oracle网站上的所有教程开始与一些固定点,该应用程序知道先验和他们使用类似补充:
`series.getData().add(new XYChart.Data(1, 23));`
但是,我想实现的是一个有点不同。 在我的情况下,我的应用程序产生了一定的效果,一旦他们的生产(任意时间)我想绘制出来的图表上。 我启动一个线程与javafx.application.Application,但是当我尝试一些点添加到系列对象,我得到一个java.lang.IllegalStateException: Not on FX application thread; currentThread = main
java.lang.IllegalStateException: Not on FX application thread; currentThread = main
异常。 什么是通过数据点,以一个JavaFX图的正确方法? 我认为,要做到这最接近的方法是重写的活动类型,活动对象,并创建一个整个事件处理结构......但这个看起来很简单的事情,我想存档的方式太复杂! 你能告诉我,在你看来,什么是该做的最好/最简单的方法是什么?
编辑:下面是一些代码你看看,并给我一些建议:
public class Chart extends Application {
private final static XYChart.Series series = new XYChart.Series();
public static void addValue(double gen, double val) {
series.getData().add(new XYChart.Data(gen, val));
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Chart");
final NumberAxis xAxis = new NumberAxis();
final NumberAxis yAxis = new NumberAxis();
final LineChart<Number,Number> lineChart =
new LineChart<Number,Number>(xAxis,yAxis);
//defining training set series
series.setName("Training");
Scene scene = new Scene(lineChart, 800, 600);
lineChart.getData().add(series);
primaryStage.setScene(scene);
primaryStage.show();
}
}
class Launcher extends Thread {
@Override
public void run() {
Application.launch(Chart.class);
}
public static void main(String[] args) throws InterruptedException {
new Launcher().start();
System.out.println("Now doing something else...");
for (int i = 0; i < 1000; i++) {
double trainValue = Math.random();
Chart.addValue(i, trainValue);
Thread.sleep(500);
}
}
}