在 JavaFX 阶段,我想在焦点离开文本字段时验证用户输入。如果用户输入不是有效的年龄(0 到 120),则会显示一个使用 ControlsFX 对话框的对话框并显示错误消息。
这是代码:
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”时不显示消息。但是我没有找到一种方法来检测这一点。
其他如何解决此问题的想法将不胜感激!
乔里斯
编辑 可能是 ControlsFX 导致崩溃。我无法使用 JavaFX 对话框(在 8u40 中引入),因为我使用的是 Javafx 8u25。欢迎任何替代品!
编辑 2 可以通过不使用 ControlsFX 对话框而是按照 DVarga 的建议“手动”创建错误消息来避免崩溃。但这会导致在窗口关闭后显示错误消息。关于如何防止这种情况发生的任何想法?