JavaFX异常关闭警报返回错误的结果

时间:2017-01-12 01:05:11

标签: java javafx dialog modal-dialog javafx-8

我创建了一个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");
    }

}

运行上述应用程序时,会显示两个对话框。点击&#34;是&#34;在第一个对话框上,然后关闭(通过单击&#34; x&#34;在右上角)第二个。通过采取上述步骤,我希望应用程序将打印以下内容:

  

是的
  没有或关闭

然而,我实际看到的是:

  

是的
  是

Dialog documentation表示&#34;异常关闭条件&#34; (例如单击右上角的小&#34; x&#34;)&#34;尝试将result属性设置为使用第一个匹配的ButtonType调用结果转换器返回的任何值。&# 34;鉴于此声明的上下文,我解释了#34;匹配ButtonType&#34;表示一个ButtonType(从文档中直接引用):

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

我对文档的解释是否不正确,或者这是JavaFX中的错误?无论为什么这不能按照我的预期工作,我有什么方法可以强迫&#34;异常关闭条件&#34;在这种情况下返回ButtonType.NO

2 个答案:

答案 0 :(得分:1)

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

setOnShowing(event -> setResult(null));

上述解决方法似乎适用于AlertChoiceDialogTextInputDialog

答案 1 :(得分:0)

以上解决方法不适用于Java 8&Win10。但这可以工作:

module.exports = {
  bracketSpacing: true,
  trailingComma: "es5",
  tabWidth: 2,
  semi: false,
  singleQuote: false,
}