2 回答

TA貢獻1773條經(jīng)驗 獲得超3個贊
您不能在 JavaFX 應用程序線程上調(diào)用Thread.sleep()
和/或while
循環(huán),因為這會導致 GUI 停止并等待循環(huán)結束。
解決方案是使用另一個線程等待,但 JavaFX 不允許從輔助線程修改任何節(jié)點。
是的,您不應該從非 JavaFX 應用程序線程修改場景圖,但這并不能阻止您調(diào)用Platform.runLater()
進行實際修改的代碼行。您也可以使用Task來實現(xiàn)這一點。
很難提供任何具體的解決方案,因為我不知道listener
flag 是如何更新的。
編輯
直到 fabian 指出,我才注意到該start()
方法屬于一個Thread
子類。你永遠不應該覆蓋Thread.start()
,更糟糕的是,super.start()
當你覆蓋它時不要調(diào)用。
所以這里發(fā)生的事情是你的GameEngine
類不再像Thread
. 調(diào)用engine.start()
只是在調(diào)用的線程中執(zhí)行您在覆蓋中編寫的任何代碼engine.start()
(恰好是 JavaFX 應用程序線程,因為您已將其包裝在 a 中Platform.runLater()
)。
如果您仍然喜歡擴展Thread
,那么您應該將代碼移動到覆蓋Thread.run()
。另請注意,您應該刪除Platform.runLater()
in initialize()
,并將其放在會影響 GUI 的任何代碼中。
例如:
Platform.runLater(() -> { myLabel.setText("User typed" + input); });

TA貢獻1810條經(jīng)驗 獲得超4個贊
基本上,使用多線程必須是明智的。一個線程在主線程編輯布局時等待。推桿
Platform.runLater(() -> {
// layout manipulations
});
如果在主線程之外,則圍繞布局操作按預期工作。
添加回答
舉報