从JavaFX中的另一个线程加载图表系列中的数据

时间:2016-11-11 01:44:28

标签: javafx charts concurrency

JavaFX为其图表系列使用可观察列表。我想从不同的线程加载系列中的数据,我已经使用Task和Platform.runLater完成了。但是,用户界面仍然不是很敏感,而且数据看起来并不顺畅。

我希望发生以下情况:

  • 用户界面保持响应。
  • 数据在图表中平滑加载 - 每个系列中一次加载一个。

    操作顺序:

    1. 加载页面
    2. 在图表中加载空图表系列
    3. 按下生成按钮
    4. 将数据加载到每个系列

代码的相关部分:

将系列载入图表

private static ObservableList<XYChart.Series<Number, Number>> pathSeries = FXCollections.observableArrayList();     

final LineChart<Number,Number> pathChart = 
            new LineChart<Number,Number>(xAxis,yAxis);

    for (int n=0; n<proc.getNumPath(); n++)
    {
        pathSeries.add(new Series<Number, Number>());
    }

    pathChart.getData().addAll(pathSeries);

将数据加载到系列

    Task task = new Task<Void>() {
    @Override public Void call() {

        // PATH SERIES
        for (int n=0; n<proc.getNumPath(); n++)
        {
            for(int i=0; i<=proc.getM(); i++)
            {   
                int pathNumber = n;
                int dataIndex = i;

                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        pathSeries.get(pathNumber).getData().add(new XYChart.Data<Number, Number>(proc.getT()[dataIndex], 
                                proc.getX()[pathNumber][dataIndex]));
                    }
                });
                if (isCancelled()) {
                    updateMessage("Cancelled");
                    break;
                }
            }
        }
        return null;
    }
};

@FXML
public void initialize(){

    generateButton.setOnAction(e -> {
        pathWorker = new Thread(task);
        pathWorker.setDaemon(true);
        pathWorker.start();
    });
}

如何在不太复杂的情况下改进代码?

enter image description here

1 个答案:

答案 0 :(得分:0)

在for循环中使用它。

Thread.sleep(100);