我有一個簡單的應用程序與網格(GridPane)和一個簡單的工具欄與開始/停止按鈕。我的按鈕動作看起來像這樣:無法更新GridPane
startButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
grid.change();
}
});
當我點擊它時,網格就像它應該改變。因爲場景圖是不是線程安全的,它只能由FX應用程序線程渲染,我已經放在一個服務至極應該更新我的網格:
private Service task = new Service(){
@Override
protected Task createTask() {
System.out.println("Task created");
return new Task<Void>() {
@Override
protected Void call() throws Exception {
for (int i = 0; i < 3; i++) {
System.out.println("calling");
Platform.runLater(new Runnable(){
@Override
public void run() {
System.out.println("running");
grid.changeGeneration();
try {
Thread.sleep(1500L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
return null;
}
};
}
};
當我跑步時我的應用程序,它提供了按下按鈕後我這個
任務創建 調用 調用 調用 運行 運行 運行
它重新計算網格模型,但它不想渲染視圖,實際上在所有Platform.runLater完成後由FX App Thread呈現網格,但不是在每個running
之後渲染。我的錯誤在哪裏?我該如何讓FX應用程序線程在每個running
之後渲染我的網格?
UPDATE: 得到了解決here,但仍不能完全理解爲什麼它拒絕工作。
我試圖把Thread.sleep()放在Task.call()中,那也沒有幫助。 – 4lex1v