我是JavaFX的新手,但我並不是Java的新手。我有一個複雜的系統,可以在循環中產生一些結果。我想要實現的是在JavaFX圖表上繪製每個迭代的結果。我這樣做沒有問題與java jFreeChart庫,但現在我正在嘗試切換到JavaFX。圖表看起來更加花哨,我喜歡風格的處理方式。無論如何,我在試圖理解如何將點添加到JavaFX應用程序中的XYChart.Series對象中掙扎。 Oracle網站上的所有教程開始與該應用程序知道先驗一些固定點,他們使用類似補充:如何將數據從java程序傳遞到javafx應用程序圖表?
`series.getData().add(new XYChart.Data(1, 23));`
但我想實現是一個有點不同。在我的情況下,我的應用程序會產生一些結果,一旦它們生成(隨機時間),我想將它們繪製在圖表上。 我使用javafx.application.Application啓動一個線程,但是當我嘗試向Series對象添加一些點時,我得到一個 java.lang.IllegalStateException: Not on FX application thread; currentThread = main
異常。 將數據點傳遞給JavaFX圖表的正確方法是什麼?我認爲最接近的方法是重寫Event類型,Event對象並創建一個完整的事件處理結構......但是對於我想要存檔的簡單事情來說,這看起來太複雜了! 您能否告訴我,在您看來,做這件事最好/最簡單的方法是什麼?
編輯: 下面是一些代碼你看看,並給我一些建議:
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);
}
}
}