На этапе JavaFX я хочу проверить ввод пользователя, когда фокус покидает текстовое поле. Если пользовательский ввод не является допустимым возрастом (от 0 до 120), то отображается Dialog using ControlsFX Dialogs с сообщением об ошибке.Javafx создает диалог по потерянному фокусу сбой приложения при закрытии окна
Вот код:
participantAgeTextField.focusedProperty()
.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov,
Boolean oldPropertyValue, Boolean newPropertyValue)
{
if(!newPropertyValue) { // lost focus
if(!participantAgeTextField.getText().isEmpty()) {
if (participantAgeTextField.getText().matches("^\\d+$")) {
int val = Integer.
parseInt(participantAgeTextField.getText());
if(val <= 0) {
val = 1;
} else if(val > 120) {
val = 120;
}
participantAgeTextField.setText(""+val);
} else {
participantAgeTextField.setText("");
Dialogs.create()
.owner(null)
.title("Error")
.masthead(null)
.message("You must enter a valid age!")
.showError();
}
}
}
}
});
Это работает отлично, за исключением того, когда пользователь вводит недопустимое значение, а затем пытается закрыть окно, нажав на кнопку «X» в правом верхнем углу окна (сцена).
В этом случае приложение «зависает». (Как ни странно, только в Windows это не происходит в Linux).
Я искал исправление, например, не отображая сообщение, когда фокус меняется на «X» окна. Однако я не нашел способа обнаружить это.
Другие идеи, как исправить это, будем очень благодарны!
Джорис
EDIT Возможно ControlsFX вызывает сбой. Я не могу использовать диалоги JavaFX (введенные в 8u40), потому что я использую Javafx 8u25. Любые альтернативы приветствуются!
EDIT 2 Аварии можно избежать, если использовать ControlsFX Диалоги но создает сообщение об ошибке «вручную», как предложено DVarga. Но это приводит к появлению сообщения об ошибке после закрытия окна. Любые идеи о том, как предотвратить это?
Вы пробовали со стандартным JavaFX 'Alert'? \t 'Предупреждающее предупреждение = новое предупреждение (AlertType.ERROR); alert.setContentText («Вы должны ввести действительный возраст!»); alert.setTitle ("Ошибка"); alert.showAndWait(); ' – DVarga
Хорошее предложение, но, к сожалению, я связан с JavaFX 8u25 (устаревший код), и Alert был введен в 8u40. – DeBaze
А, я вижу редактирование сейчас;) – DVarga