2 回答
TA贡献1773条经验 获得超3个赞
您不能在 JavaFX 应用程序线程上调用Thread.sleep()
和/或while
循环,因为这会导致 GUI 停止并等待循环结束。
解决方案是使用另一个线程等待,但 JavaFX 不允许从辅助线程修改任何节点。
是的,您不应该从非 JavaFX 应用程序线程修改场景图,但这并不能阻止您调用Platform.runLater()
进行实际修改的代码行。您也可以使用Task来实现这一点。
很难提供任何具体的解决方案,因为我不知道listener
flag 是如何更新的。
编辑
直到 fabian 指出,我才注意到该start()
方法属于一个Thread
子类。你永远不应该覆盖Thread.start()
,更糟糕的是,super.start()
当你覆盖它时不要调用。
所以这里发生的事情是你的GameEngine
类不再像Thread
. 调用engine.start()
只是在调用的线程中执行您在覆盖中编写的任何代码engine.start()
(恰好是 JavaFX 应用程序线程,因为您已将其包装在 a 中Platform.runLater()
)。
如果您仍然喜欢扩展Thread
,那么您应该将代码移动到覆盖Thread.run()
。另请注意,您应该删除Platform.runLater()
in initialize()
,并将其放在会影响 GUI 的任何代码中。
例如:
Platform.runLater(() -> { myLabel.setText("User typed" + input); });
TA贡献1810条经验 获得超4个赞
基本上,使用多线程必须是明智的。一个线程在主线程编辑布局时等待。推杆
Platform.runLater(() -> {
// layout manipulations
});
如果在主线程之外,则围绕布局操作按预期工作。
添加回答
举报