0
JavaFX使用可观察列表作为其图表系列。我想从一个不同的线程加载系列中的数据,我通过使用Task和Platform.runLater来完成。然而,UI仍然不是非常敏感,数据看起来并不顺利,未来从JavaFX中的另一个线程加载图表系列中的数据
我想以下情况发生:
- 用户界面保持响应。
数据在图形中平滑地加载 - 每个系列一次一个。操作
订单:
- 加载页面
- 装入空图表系列在图表
- 按生成按钮
- 将数据加载到每个系列
相关部分代码:
个负载串联成图表
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();
});
}
我怎样才能提高我的代码没有得到太复杂?
你可能不会喜欢这个评论,但是这看起来像是大量的数据。图表API(imho)并不是真正为这种规模的数据设计的,您可能会发现需要使用画布来滚动您自己的实现(例如,使用画布)以获得具有大量数据的响应式UI。基本问题是每个数据点由场景图中的节点表示,并且每个节点都有大量的属性,其外观由相当昂贵的CSS代码控制。你可以尝试一些东西 - 例如关闭图表上的动画 - 但这可能是太多的数据。 –
我想调用Thread.sleep(100);将有助于GUI响应。玩数字。您的数据将需要更长的时间才能加载。 – Sedrick