2012-04-03 12 views
3

私は何が間違っているのか分かりません。エラー!スレッド「AWT-EventQueue-0」の例外java.lang.IllegalStateException:FXアプリケーションスレッドではありません。 currentThread = AWT-EventQueue-0

GUIの上部にあるテキストグラフィックを更新するタイマーを作成しました。タイマーがなくなると、変数(リスナーにリンクされている)が変更され、新しいグラフィック 'Scene/Group/Node'がGUIに追加されます。私のChangeListener にリンクされた - と私のGUI //ないリスナーにシーンを追加する//変数が、私のGUI

に新しい要素を追加し-Changing

これらの追加の両方が私のプログラムがでクラッシュを引き起こしますそのエラー:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0 
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:235) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:393) 

サンプルエラーコード:

int delay = new Integer(1000); //milliseconds 
time_left=time_limit; 


ActionListener taskPerformer = new ActionListener() { 
     @Override 
     public void actionPerformed(java.awt.event.ActionEvent arg0) { 
      // TODO Auto-generated method stub 
      timer.setText(time_left+" SECONDS LEFT"); 


      time_left=time_left-1; 
      if (time_left<0) 
      { 
       //time_left=time_limit; 
       mytimer.stop(); 
       //mytimer.start(); 
      root.getChildren().get(2).setOpacity(.2); 
      //root.getChildren().add(3,newScene());   //This causes to crash  //Adds a new Scene to my GUI 
      current_player.setValue(false);   //Also causes to crash - current_player has a Listener on it 
       //System.out.println("TIMER RAN OUT!"); 
      } 


     } 
}; 
mytimer=new Timer(delay, taskPerformer); 
mytimer.start(); 

私current_playerリスナー:

current_player.addListener(new ChangeListener<Boolean>() { 

      @Override 
      public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
//Code in Here 
} 
{); 

答えて

1

例外メッセージは明白ではありません。 Swing timerを使用します。これはイベントディスパッチスレッドでリスナーを呼び出します(Swingアプリケーションの使用時に必要です)。

ただし、FXアプリケーションスレッドではなく、そのスレッドでJavaFX UIを更新します。

私はJavaFXの精通(まだ)ないけど、うまくいけば、彼らはあなたが使用できるだけでなく、またはあなたがactionPerformed方法

編集に使用することができEventQueue.invokeAndWaitに似たものとして、このようなタイマーメカニズムを持っている:

グーグルのビットをして、良い読んでいるかもしれないthis page about concurrency in JavaFXを見つけました。しかし、タイマークラスの言及はありません。おそらくAnimationクラスがあなたが探しているものです