【问题标题】:Javafx create dialog on lost focus crashes the app when closing window关闭窗口时,Javafx 在失去焦点时创建对话框会使应用程序崩溃
【发布时间】:2016-10-09 23:29:07
【问题描述】:

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

【问题讨论】:

  • 您是否尝试过使用标准 JavaFX AlertAlert alert = new Alert(AlertType.ERROR); alert.setContentText("You must enter a valid age!"); alert.setTitle("Error"); alert.showAndWait();
  • 好建议,但不幸的是我绑定到 JavaFX 8u25(遗留代码)并且在 8u40 中引入了警报。
  • 啊,我现在看到了编辑;)
  • 我的错误。我应该首先指出这一点..
  • 你可以看看这个:github.com/BertelSpA/openjfx-dialogs-jdk7。或者作为最后的希望,“实现”您自己的对话:stackoverflow.com/questions/8309981/…

标签: javafx controlsfx


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    相关资源
    最近更新 更多