2016-05-22 3 views
0

私はFXMLファイルにラベルを持っている:バックグラウンドワーカーからfxmlラベルを更新するには?

<Label fx:id="labelA"/> 

私は労働者が実行しているバックグラウンド中にコントローラでこれを更新したいです。私はこのような何かをしようとしている:

public class FXHelloCVController 
{ 
    @FXML 
    private Label labelA; 
    @FXML 
    protected void startMatching(ActionEvent event) 
    { 
     SwingWorker<Boolean, String> worker = new SwingWorker<Boolean, String>() 
     { 
      @Override 
      protected Boolean doInBackground() throws Exception 
      { 

       for(int y=0; y<*something*; y++){ 
        if(n.get(y)!=null){ 
         ... 
         publish(n.get(y).name); 
         ... 
        } 
       } 
       return true; 
      } 

      @Override 
      protected void process(List<String> chunks) { 
       String n = chunks.get(chunks.size()-1); 
       labelA.setText(n); 
      } 
     }; 
     worker.execute(); 
     return; 
    } 

しかし、機能が「labelA.setText(nは)」と呼ばれたとき、それは次の例外表示されます。

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0 

何が間違っているの?

+0

GiannaはこのJavaではなくSwingとJavaFXを混在させないでください。ServiceクラスとWorkerクラスはhttp://docs.oracle.com/javafx/2/threads/jfxpub-threadsのように見えます。 htm(一度に学ぶのはあまり簡単ではありませんが、いったんやったら本当にクールです)。 – GOXR3PLUS

答えて

2

Platform.runLater:GUI以外のスレッドからGUIコンポーネントを更新する必要がある場合は、そのコンポーネントを使用して更新をキューに入れることができます。できるだけ早くGUIスレッドによって処理されます。

Platform.runLater(new Runnable() { 
     @Override public void run() { 
      // update an FXML node (e.g. label) 
     } 
    }); 

出典:Platform.runLater and Task in JavaFX

しかし、あなたがスイングし、通常ではないJavaFXのを、使用しています。

+0

パーフェクト回答ありがとう! – Gianna

1

SwingWorkerはSwing用であり、JavaFX用ではありません。対応するJavaFX並行性メカニズムのドキュメントを見てください。

関連する問題