1

私はJavaFXは初めてですが、Javaは初めてではありません。ループでいくつかの結果を生成する大きく複雑なシステムがあります。私が達成しようとしているのは、各反復の結果を JavaFX チャートにプロットすることです。Java jFreeChart ライブラリでは問題なくこれを行っていましたが、現在は JavaFX に切り替えようとしています。グラフはより派手に見え、スタイルの処理方法が気に入っています。とにかく、JavaFX アプリケーションで XYChart.Series オブジェクトにポイントを追加する方法を理解するのに苦労しています。オラクルの Web サイトのすべてのチュートリアルは、アプリケーションがアプリオリに知っているいくつかの固定ポイントから始まり、次のようなものを使用して追加されます。

`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 に答える