我的对话框窗格上有三个不同的按钮,即 dialogPane.saveButtondialogPane.deleteButtondialogPane.cancelButton .

根据按下了哪个按钮,我想返回不同的东西(特别是,如果按下删除按钮,我想返回null):

setResultConverter(result -> {
  if (result == dialogPane.saveButton) {
    return new Data("Save button has been pressed");
  } else if (result == dialogPane.deleteButton) {
    return null;
  }
  return defaultData;
});

然而,上面的实现是不正确的,或者至少,它没有做我期望它做的事情 . 使用调试器,我可以看到,当单击删除按钮时,null会正确返回(从Dialog#impl_setResultAndClose调用) . 然而,在那之后,再次调用结果转换器,这次由于某种原因回退到取消按钮 .

我一遍又一遍地阅读dialog documentation,但我无法理解它 . 它指出

对话框结束规则了解对话框关闭时会发生什么以及如何关闭对话框非常重要,尤其是在异常关闭情况下(例如在对话框 Headers 栏中单击“X”按钮时,或者何时输入操作系统特定的键盘快捷键(例如Windows上的alt-F4) . 幸运的是,在这些情况下结果是明确定义的,并且可以在以下要点中进行最佳总结:JavaFX对话框只能在两种情况下“异常”关闭(如上所述):当对话框只有一个按钮时,或者当对话框有多个按钮时,只要其中一个按钮满足以下要求之一:该按钮具有ButtonType,其ButtonBar.ButtonData的类型为ButtonBar.ButtonData.CANCEL_CLOSE . 该按钮具有ButtonType,当调用ButtonBar.ButtonData.isCancelButton()时,ButtonBar.ButtonData返回true . 在所有其他情况下,对话框将拒绝响应所有关闭请求,在用户单击对话框的DialogPane区域中的某个可用按钮之前保持打开状态 . 如果对话框异常关闭,并且对话框包含满足上述两个条件之一的按钮,则对话框将尝试将result属性设置为使用第一个匹配的ButtonType调用结果转换器返回的任何值 . 如果由于任何原因结果转换器返回null,或者当仅存在一个非取消按钮时关闭对话框,则result属性将为null,并且showAndWait()方法将返回Optional.empty() . 后面的这一点意味着,如果你使用选项2或选项3(如本类文档前面所述),则永远不会调用Optional.ifPresent(java.util.function.Consumer)lambda,代码将继续执行好像对话框根本没有返回任何值 .

在我的理解中,我遇到了最后一点:我的对话框没有异常关闭(通过单击按钮关闭它),我的结果转换器返回null,所以我希望它返回 Optional.empty() . 然而,它试图返回取消按钮返回的值(最后一点上方的子弹) .

我在这里误解了一些东西(例如,我是否错误地解释了这个词?),或者JavaFX的对话系统中是否存在实现错误?