【发布时间】:2017-01-12 01:05:11
【问题描述】:
我创建了一个 JavaFX Alert 对象,该对象在调用 showAndWait 时会返回意外结果。下面的代码说明了我观察到的行为:
package myPackage;
import java.util.Optional;
import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonBar.ButtonData;
import javafx.scene.control.ButtonType;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(final String[] args) {
launch();
}
private static boolean isYes(final Optional<ButtonType> result) {
return (result.isPresent() && result.get().getButtonData() == ButtonData.YES);
}
@Override
public void start(Stage primaryStage) throws Exception {
final Alert alert = new Alert(AlertType.CONFIRMATION,
"This is a test", ButtonType.NO, ButtonType.YES);
System.out.println(isYes(alert.showAndWait()) ? "Yes" : "No or Closed");
System.out.println(isYes(alert.showAndWait()) ? "Yes" : "No or Closed");
}
}
当我运行上述应用程序时,会显示两个对话框。在第一个对话框上单击“是”,然后关闭(通过单击右上角的“x”)第二个。通过上述步骤,我希望应用程序会打印以下内容:
是的
否或关闭
但是,我实际看到的是:
是的
是的
Dialog documentation 声明“异常关闭条件”(例如单击右上角的小“x”)将“尝试将结果属性设置为通过调用结果转换器返回的任何值第一个匹配的 ButtonType。”鉴于此声明的上下文,我将“匹配 ButtonType”解释为 ButtonType (直接引用文档):
- 按钮具有 ButtonType,其 ButtonBar.ButtonData 的类型为 ButtonBar.ButtonData.CANCEL_CLOSE。
- 该按钮有一个 ButtonType,其 ButtonBar.ButtonData 在调用 ButtonBar.ButtonData.isCancelButton() 时返回 true。
我对文档的解释不正确,还是 JavaFX 中的错误?不管为什么这不能像我预期的那样工作,在这种情况下有什么办法可以强制“异常关闭条件”返回ButtonType.NO?
【问题讨论】:
-
我注意到,如果我在两次调用
alert.showAndWait()之间调用alert.setResult(null),它会按照记录的方式工作(第二次调用的结果是ButtonType.NO)。是否存在isPresent对Alert为假的情况? -
如果您在将
NO按钮映射到null的警报上设置结果转换器,isPresent将返回 false (AIUI)。至于你的主要问题,这看起来像一个错误。 -
似乎不是一个错误。
showAndWait从未声称要清除result属性(事实上,这甚至可能是允许用户在未指定有效输入的情况下指定默认结果的理想行为......)。 -
@fabian 我同意
showAndWait的文档没有声明,但是如果您阅读了Dialog的文档,它确实如此。在此对话框中,ButtonData.NO.isCancelButton()为真,符合第二个条件。因此,根据我对文档的阅读,“异常关闭”对话框应始终使用ButtonType.NO填充结果。我已经确认,在选择“是”按钮之前取消实际上会返回ButtonType.NO作为结果。
标签: java javafx dialog modal-dialog javafx-8