在JavaFX阶段,我想在焦点离开文本字段时验证用户输入。如果用户输入不是有效年龄(0到120),则会显示带有错误消息的Dialog using ControlsFX Dialogs。
以下是代码:
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的建议“手动”创建错误消息。但这会导致窗口关闭后显示错误消息。关于如何防止这种情况发生的任何想法?
答案 0 :(得分:0)
我想我会按照以下方式规避崩溃:
在输入错误的情况下,在失去焦点后显示“弹出”对话框窗口,我将在输入框旁边以红色显示错误消息。在重新获得焦点时,我可以删除错误消息。