我试图做一个JavaFX游戏。有一个主线程(B)在另一个线程(A)onMouseReleased中启动一些物理计算。线程A计算所需的移动并使数字在屏幕上移动。球停止后,应改变场景以显示结果,并让用户重新启动水平或进一步。如何制作线程如果A由B启动,JavaFX线程B中的变化场景?
如果在B中使用join()等待A完成并更新场景,则B在A中执行计算时不响应,也不显示数字的移动。这是不可接受的。
如果试图从A更改应用场景,我得到
java.lang.IllegalStateException:没有对外汇的应用程序线程
我要实现什么概念,使后的游戏画面出现?
这里是线程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的方法。