Ответ 1
Решение
Когда ваш фоновый процесс сталкивается с ситуацией, когда требуется, чтобы пользователь запрашивал ввод, используйте FutureTask, выполненный в Platform.runLater в showAndWait диалоговое приглашение в потоке приложений 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();
}
...
}
Пример приложения
Я создал небольшое, полное примерное приложение, чтобы продемонстрировать этот подход.
Вывод примерного приложения:
Пример вывода Объяснение
Линии, считанные без пропущенных значений, просто коричневые.
Строки с введенным быстрым значением имеют бледно-зеленый фон.
Четырнадцать строк были прочитаны, фоновая задача уже приостановлена на 6-й строке, где отсутствует значение. Пользователю было предложено указать отсутствующее значение (к которому пользователь ввел xyzzy
), затем процесс продолжался до тех пор, пока строка 14 не исчезнет, а фоновая задача снова приостановлена, и появится диалоговое окно приглашения.