14

csvファイルからトランザクションデータの一括読み込みを実行するバックグラウンドサービスを設定しようとしています。このバックグラウンドサービスは、コントローラー/プレゼンタークラスのメソッドにマップされたメニュー項目アクションから開始されます。

データベースにマスターデータが見つからないデータがcsvファイルに表示されることがよくあります。これにより、通常、アップロードが停止して失敗します。

そのような場合、バックグラウンドサービスで処理を一時停止し、プレゼンタークラスからダイアログを呼び出してユーザー入力を取り込むことができるようにしたいと思います。ユーザー入力を使用してデータベースにマスター行を追加します。その後、バックグラウンドサービスは、中断したところから再開する必要があります(csvファイルの先頭からではなく、エラーの原因となった行から)。

これは、おそらくjavafx.concurrent APIを使用してJavaFXで実現できますか?どうすればこれを行うことができますか?

4

1 に答える 1

24

解決

バックグラウンドプロセスで、ユーザーに入力を求めるプロンプトが表示される状況が発生した場合は、Platform.runLaterで実行されるFutureTask使用して、JavaFXアプリケーションスレッドでダイアログプロンプトを表示して待機します。バックグラウンドプロセスでは、futureTask.getを使用して、ユーザーがプロセスの続行を可能にする必要な値を入力するまで、バックグラウンドプロセスを一時停止します。


サンプルコードスニペット

このアプローチのコードの本質は次のとおりです。これは、バックグラウンドプロセスの呼び出しメソッド内に配置できます。

String nextText = readLineFromSource();
if ("MISSING".equals(nextText)) {
  updateMessage("Prompting for missing text");
  FutureTask<String> futureTask = new FutureTask(
    new MissingTextPrompt()
  );
  Platform.runLater(futureTask);
  nextText = futureTask.get();
}
...
class MissingTextPrompt implements Callable<String> {
  private TextField textField;

  @Override public String call() throws Exception {
    final Stage dialog = new Stage();
    dialog.setScene(createDialogScene());
    dialog.showAndWait();
    return textField.getText();
  }
  ...
}

サンプルアプリケーション

このアプローチを示すために、小さくて完全なサンプルアプリケーションを作成しました。

サンプルアプリケーションの出力は次のとおりです。

promptingtaskdemooutput

サンプル出力の説明

値が欠落せずに読み取られた行は、単なる茶色です。プロンプト値が入力された行の背景は薄緑色です。14行が読み取られ、値が欠落している6行目でバックグラウンドタスクがすでに1回一時停止しています。ユーザーは(ユーザーが入力したxyzzy)欠落している値の入力を求められ、14行目までプロセスが続行されました。これも欠落しており、バックグラウンドタスクが再び一時停止され、別のプロンプトダイアログが表示されます。

于 2013-02-19T21:36:16.997 に答える