1

在 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 的建议“手动”创建错误消息来避免崩溃。但这会导致在窗口关闭后显示错误消息。关于如何防止这种情况发生的任何想法?

4

1 回答 1

0

我想我会绕过崩溃如下:

如果输入错误,我不会在失去焦点后显示“弹出”对话框窗口,而是在输入框旁边显示一条红色的错误消息。重新获得焦点后,我可以删除错误消息。

于 2016-06-09T12:06:51.373 回答