在JavaFX对话框结果转换器

时间:2018-01-15 17:25:25

标签: java javafx dialog javafx-8

我的对话框窗格中有三个不同的按钮,即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,但我无法理解它。它声明

  

对话关闭规则

     

了解对话框关闭时会发生什么以及如何关闭对话框非常重要,尤其是在异常关闭情况下(例如在对话框标题中单击“' 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对话系统中是否存在实施错误?

0 个答案:

没有答案