我正在用JavaFX做一个基于步骤的游戏,我正在使用do while循环来等待用户输入。问题是,它是从fxml控制器初始化方法调用的,这意味着接口永远不会加载。解决方案是使用另一个线程等待,但JavaFX不允许从辅助线程修改任何节点。
我使用下面的代码避免了“不在FX应用程序线程上”:
public void initialize(URL arg0, ResourceBundle arg1) {
// I call the game engine to start the game sequence and I pass root into it for further use
engine = new GameEngine(root);
Platform.runLater(new Runnable() {
@Override
public void run() {
engine.start();
}
});
}
在engine.start()方法中:
public void start() {
System.out.println("Game started");
text("Hello, stranger"); // a new Label inside VBox
do {
try {
Thread.sleep((long) 1000);
System.out.println("Sleeping...");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Error... waiting?");
}
} while(this.listener == false); // Listener triggers when user inputs.
System.out.println("ENTER PRESSED, May proceed");
text("It worked!");
}
另外,GameEngine扩展了线程,我不知道它对多线程有什么影响。
当代码启动时,UI崩溃,输出进入休眠状态...每一秒都应该如此。
发布于 2018-10-20 00:45:46
基本上,使用多线程必须是明智的。当主线程编辑布局时,一个线程等待。推杆
Platform.runLater(() -> {
// layout manipulations
});
如果在主线程之外,布局操作将按预期工作。
https://stackoverflow.com/questions/52864637
复制相似问题