如何从Java程序的数据传递到JavaFX应用程序的图表?(How to pass data fro

2019-08-17 19:17发布

我是新来的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);
        }
    }

}

Answer 1:

以确保代码点添加到图表JavaFX的线程中执行,你可以将其添加到它获取了JavaFX线程上执行一个Runnable-对象:

Platform.runLater(new Runnable() {
    @Override
    public void run() {
       // code to add points to the chart
    }
});

希望这可以帮助。 托斯滕



文章来源: How to pass data from java program to javafx application chart?