我创建了一个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”)将“尝试将result属性设置为在第一次匹配时调用结果转换器返回的任何值ButtonType。”给定此语句的上下文,我将“匹配的ButtonType”解释为表示以下任一类型的ButtonType(来自文档的直接引号):


  
  该按钮具有一个ButtonType,其ButtonBar.ButtonData的类型为ButtonBar.ButtonData.CANCEL_CLOSE。
  该按钮具有一个ButtonType,当调用ButtonBar.ButtonData.isCancelButton()时,其ButtonBar.ButtonData返回true。
  


我对文档的解释不正确,还是JavaFX中的错误?不管为什么这不能按我预期的那样工作,在这种情况下,有什么方法可以强制“异常关闭条件”返回ButtonType.NO

最佳答案

这是JavaFX中的另一个错误。我已将其报告给Oracle,并为其分配了错误ID JDK-8173114。作为解决方法,我只是将以下行添加到我的JavaFX Alert子类的构造函数中:

setOnShowing(event -> setResult(null));


上面的变通办法似乎适用于AlertChoiceDialogTextInputDialog

09-12 23:29