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

标签 java multithreading javafx

我正在尝试制作 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/

相关文章:

java - 为什么 BufferedImage 不能正常工作?!!是因为我用错了吗?

multithreading - eclipse RCP : Only one Job runs at a time?

Java 实例变量同步

java - 背景和按钮问题

javafx - 自动编号表行(javafx)

java - 为什么我在启动简单代码(JavaFX)时遇到问题?

java - 在 Java 中获取系统的 MAC 地址

java - 如何在 JavaFX 中更改 TextArea 的行距

java - 从 onClick() 内部类访问程序数据

multithreading - 如何在 Go 中使用 channel 发送方向