2013-03-20 47 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

相关问题