2012-12-18 11 views
6

コアモジュールを他のプラットフォーム用のバージョンと共有するアプリケーションのUIを作成しています。 JavaFXでは、バックグラウンドで作業するのにTaskを使用しようとしていますが、タスクの状態を更新する方法がわかりません。JavaFX並行タスク設定状態

これは私がやろうとしていることです。

loginTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
      @Override 
      public void handle(WorkerStateEvent t) { 
       // perform an UI update here depending on the state t 
      } 
     }); 

どのようにしています:私は私のグラフのUIを更新するには、このような何かを行うことができるようにしたい私のUIスレッドで

public Task<Integer> doLogin() 
{ 
    return new Task<Integer>() { 
     @Override 
     protected Integer call() 
     { 
      user.login(); 
      if (!user.getIsAuthorized()) 
      { 
       // set the state to FAILED 
      } 
      else 
      { 
       // set the state to SUCCEDED 
      } 
      user.remember(); 
     } 
    }; 

} 

user変数は要求を実行するクラスのインスタンスを保持しています私は状態を設定するはずですか? Task APIには何もありません。

答えて

11

Task州はユーザーロジックに使用することを意図していません。それらは、Taskフローを制御するために導入されています。 Taskにユーザーロジックを追加するには、resultという概念を使用する必要があります。あなたのケースでは、Task<Boolean>を使用することもできますし、あなたの仕事の結果が正しくないため、正しい資格情報TRUEFALSE次のようになります。

タスクの作成:

public Task<Boolean> doLogin() { 
    return new Task<Boolean>() { 
     @Override 
     protected Boolean call() { 
      Boolean result = null; 
      user.login(); 
      if (!user.getIsAuthorized()) { 
       result = Boolean.FALSE; 
      } else { 
       result = Boolean.TRUE; 
      } 
      user.remember(); 
      return result; 
     } 
    }; 
} 

そのタスクの開始:

final Task<Boolean> login = doLogin(); 
login.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
    @Override 
    public void handle(WorkerStateEvent t) { 
     // This handler will be called if Task succesfully executed login code 
     // disregarding result of login operation 

     // and here we act according to result of login code 
     if (login.getValue()) { 
      System.out.println("Successful login"); 
     } else { 
      System.out.println("Invalid login"); 
     } 

    } 
}); 
login.setOnFailed(new EventHandler<WorkerStateEvent>() { 
    @Override 
    public void handle(WorkerStateEvent t) { 
     // This handler will be called if exception occured during your task execution 
     // E.g. network or db connection exceptions 
     System.out.println("Connection error."); 
    } 
}); 
new Thread(login).start();