2013-03-20 44 views
1

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

} 

回答

1

,以確保代碼點添加到圖表JavaFX的線程 內執行你可以將它添加到在JavaFX線程中執行的Runnable-Object:

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

希望這有助於。 Torsten

相關問題