gpt4 book ai didi

java - 如果A是由B启动的,如何使线程A在JavaFX线程B中改变场景?

转载 作者:行者123 更新时间:2023-12-01 10:34:41 25 4
gpt4 key购买 nike

我正在尝试制作 JavaFX 游戏。有一个主线程(B)在另一个线程(A)onMouseReleased 上启动一些物理计算。线程 A 计算所需的移动并使图形在屏幕上移动。球停止后,应更改场景以显示结果并让用户重新启动关卡或继续前进。

如果在B中使用join()等待A完成然后更新场景,则在A中执行计算时B不会响应,并且不会显示人物移动。这是 Not Acceptable 。

如果尝试从 A 更改应用程序场景,我会得到

java.lang.IllegalStateException:不在 FX 应用程序线程上

我应该实现什么概念才能使赛后屏幕出现?

这是线程A的结构:

class Physics implements Runnable{
private Ball ball;
private Pane game;
private Thread t;
private boolean paused;
Physics(Pane game, Ball ball){
super();
this.ball=ball;
this.game=game;
this.paused=true;
t=new Thread(this);
}
public void run(){
this.unPause();
while(ball.getXSpeed()!=0||ball.getYSpeed()!=0){
try {
sleep(20);

}
catch (InterruptedException ex){
ball.stop();
}
if(!paused) {
ball.step();
interactGravities();
checkObstacles();
checkTargets();
checkEdges();
}
}
Main.showResult();
}
}

checkObstacles、checkTargets、checkEdges中的每一个都可以使ball.stop(),从而使while循环结束。 Main.showResult() 是尝试在线程 B 中 setScene() 但得到 java.lang.IllegalStateException 的方法。

最佳答案

您应该使用 Platform.runLater() 。该命令强制执行 JavaFx 线程中 Runnable(在 Platform.runLater 方法的参数中获取)提供的任务。使用 setScene 命令或其他函数来操作该 Runnable 内的场景。

P.S runnable 也可以表示为 java8 中的 Lambda 表达式。

关于java - 如果A是由B启动的,如何使线程A在JavaFX线程B中改变场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34840863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com