解決
バックグラウンドプロセスで、ユーザーに入力を求めるプロンプトが表示される状況が発生した場合は、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();
}
...
}
サンプルアプリケーション
このアプローチを示すために、小さくて完全なサンプルアプリケーションを作成しました。
サンプルアプリケーションの出力は次のとおりです。
サンプル出力の説明
値が欠落せずに読み取られた行は、単なる茶色です。プロンプト値が入力された行の背景は薄緑色です。14行が読み取られ、値が欠落している6行目でバックグラウンドタスクがすでに1回一時停止しています。ユーザーは(ユーザーが入力したxyzzy
)欠落している値の入力を求められ、14行目までプロセスが続行されました。これも欠落しており、バックグラウンドタスクが再び一時停止され、別のプロンプトダイアログが表示されます。