从另一个线程更新UI(时间之后)

时间:2016-05-13 14:22:40

标签: java javafx

我试图在一段时间后更新primaryStage。这给了我:java.lang.IllegalStateException: Not on FX application thread; 我一直在寻找StackOverflow的解决方案,我发现有些人建议使用

Platform.runLater(new Runnable ...)

来源:https://stackoverflow.com/a/17851019/5314214

但是我仍然无法弄清楚如何在一段时间后使其工作。

我的代码:

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        update(primaryStage);
        timer.cancel();
    }
}, 400);

2 个答案:

答案 0 :(得分:3)

这是做到这一点的方法:

Timer timer = new Timer();
timer.schedule(
    new TimerTask() {
        @Override
        public void run() {
            Platform.runLater(() -> update(primaryStage));
            timer.cancel();
        }
    }, 400
);

任何时候你想要从另一个线程修改你的舞台,你需要通过Platform.runLater来修改你的舞台,因为只有FX application thread被允许这样做,确实JavaFX没有设计成并发线程使用它来防止难以修复的错误。

答案 1 :(得分:2)

另一种解决方案是使用PauseTransition。好处是您不必使用Platform.runLater()

  PauseTransition pauseTransition = new PauseTransition(Duration.millis(400));
  pauseTransition.setOnFinished(e -> updateStage());
  pauseTransition.playFromStart();