2017-01-11 9 views
0
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); 

毎秒新しいサークルを作成し、それを形状と呼ばれるサークルのarraylistに追加します。私はそれらをMyPaneに追加してjavafxウィンドウに表示する必要がありますタイミングループなどでjavafxペインを更新していますか?

ただし、このエラーが発生します。

スレッド "Timer-0"の例外java.lang.IllegalStateException:FXアプリケーションスレッドではありません。 currentThread = Timer-0

私はScheduledExecutorServiceのような他のタイミングメソッドを使用しようとしましたが、私の配列リストを渡すことができませんでした。このタイミング方法で新しいサークルを作成して配列に追加することはできますが、画面上に表示することはできません。任意の助けを事前に

Thnaks

答えて

1

ザッツあなたは(エラーの説明が言うように)非JavaFXのスレッドでのJavaFXノードを変更しようとするため。私は次の問題が修正されると思います。

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); 

基本的にPlatform.runLater()はTHR JavaFXの-メインスレッド上で指定した実行可能を実行します。 mainThreadのように、uiが応答しなくなった瞬間を防ぐために、操作を可能な限り小さくする必要があります(上記のように)。