在定时循环或其他循环中更新javafx窗格?

在定时循环或其他循环中更新javafx窗格?,java,javafx,Java,Javafx,每秒钟我都会创建一个新的圆,并将其添加到名为“形状”的圆阵列列表中。我需要他们将其添加到MyPane,以便在javafx窗口中显示它 但是我得到了这个错误 线程“Timer-0”java.lang.IllegalStateException中的异常:不在FX应用程序线程上;currentThread=Timer-0 我曾尝试使用其他计时方法,如ScheduledExecutorService,但未能传入数组列表。这种计时方法允许我创建新的圆圈并将它们添加到阵列中,但我无法在屏幕上显示它们 因为您

每秒钟我都会创建一个新的圆,并将其添加到名为“形状”的圆阵列列表中。我需要他们将其添加到MyPane,以便在javafx窗口中显示它

但是我得到了这个错误

线程“Timer-0”java.lang.IllegalStateException中的异常:不在FX应用程序线程上;currentThread=Timer-0

我曾尝试使用其他计时方法,如ScheduledExecutorService,但未能传入数组列表。这种计时方法允许我创建新的圆圈并将它们添加到阵列中,但我无法在屏幕上显示它们


因为您试图在非javafx线程中修改javafx节点(如错误描述所述),所以需要提前获得任何帮助。我认为以下几点可以解决这个问题

Timer randomTimer = new Timer();
     randomTimer.schedule(new TimerTask() {
     @Override
     public void run() {

         IN HERE IS A LONG PROCESS OF ADDING A CIRCLE TO MY ARRAYLIST CALLED
         SHAPES WHICH HAS NO ERROR ON ITS OWN

         int size = Shapes.size();
         MyPane.getChildren().add(Shapes.get(size));
         }
    }, 0, 1000);
基本上,
Platform.runLater()
将在thr JavaFX主线程上运行给定的runnable。因为它是主线程,所以您应该尽可能地减少操作(如上所示),以防止ui出现无响应的情况

 Timer randomTimer = new Timer();
 randomTimer.schedule(new TimerTask() {
     @Override
     public void run() {
           // do your stuff including the next
           int size = Shapes.size();
           Platform.runLater(() -> {
               MyPane.getChildren().add(Shapes.get(size));
          });
     }
}, 0, 1000);