关闭窗口时,Javafx在失去焦点时创建对话框会导致应用程序崩溃

时间:2016-06-09 10:47:33

标签: javafx controlsfx

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

1 个答案:

答案 0 :(得分:0)

我想我会按照以下方式规避崩溃:

在输入错误的情况下,在失去焦点后显示“弹出”对话框窗口,我将在输入框旁边以红色显示错误消息。在重新获得焦点时,我可以删除错误消息。