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