2 回答
TA贡献1773条经验 获得超3个赞
您不能在 JavaFX 应用程序线程上调用Thread.sleep()和/或while循环,因为这会导致 GUI 停止并等待循环结束。
解决方案是使用另一个线程等待,但 JavaFX 不允许从辅助线程修改任何节点。
是的,您不应该从非 JavaFX 应用程序线程修改场景图,但这并不能阻止您调用Platform.runLater()进行实际修改的代码行。您也可以使用Task来实现这一点。
很难提供任何具体的解决方案,因为我不知道listenerflag 是如何更新的。
编辑
直到 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
});
如果在主线程之外,则围绕布局操作按预期工作。
添加回答
举报
