1

我是 JavaFX 的新手,但我对 Java 并不陌生。我有一个大型复杂系统,它会在循环中产生一些结果。我想要实现的是在 JavaFX 图表上绘制每次迭代的结果。我这样做对 java jFreeChart 库没有任何问题,但现在我正在尝试切换到 JavaFX。图表看起来更花哨,我喜欢风格的处理方式。无论如何,我正在努力了解如何在 JavaFX 应用程序中向 XYChart.Series 对象添加点。oracle 网站上的所有教程都以应用程序先验知道的一些固定点开始,并使用以下内容添加它们:

`series.getData().add(new XYChart.Data(1, 23));`

但我想要达到的目标有点不同。在我的情况下,我的应用程序会产生一些结果,一旦产生(随机时间),我想将它们绘制在图表上。我使用 javafx.application.Application 启动了一个线程,但是当我尝试向 Series 对象添加一些点时,我得到了一个 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);
        }
    }

}
4

1 回答 1

0

为了确保向图表添加点的代码在 JavaFX 线程中执行,您可以将其添加到在 JavaFX 线程上执行的 Runnable-Object 中:

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

希望这可以帮助。托尔斯滕

于 2013-07-11T10:05:26.537 回答