2016-01-17 12 views
0

我试图做一个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的方法。

回答

1

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

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

相关问题