JavaFX对话框的getResult()方法未返回正确的泛型类型

时间:2018-09-15 08:13:08

标签: java generics javafx classcastexception

我在处理JavaFX Dialog<R>类时遇到问题。我创建了一个带有自定义类型参数的对话框,为简单起见,说String。现在,每当我尝试获取对话框的结果时,我都会得到一个ClassCastException

使用这个简单的JavaFX应用程序:

@Override
public void start(Stage primaryStage) {
    Dialog<String> dialog = new Dialog<>();
    dialog.getDialogPane().getButtonTypes().setAll(ButtonType.OK);
    String result = dialog.showAndWait().orElse(null);
}

一旦我按下“确定”按钮,就会出现错误堆栈,导致:

Caused by: java.lang.ClassCastException: javafx.scene.control.ButtonType cannot be cast to java.lang.String

不用说,代码可以完美地编译。似乎每当触发“确定”按钮时,对话框的值就会被强制设置为ButtonType类型。不是您希望知道方法签名的类型。

如果在显示对话框之后使用方法getResult(),这也是正确的。

我使用Oracle的JVM 1.8.0_151。

感谢您的见解。

1 个答案:

答案 0 :(得分:3)

如果类型不是VoidButtonType,则Dialog API要求您设置结果转换器回调。为了使您的示例运行:

@Override
public void start(Stage primaryStage) {
    Dialog<String> dialog = new Dialog<>();
    dialog.getDialogPane().getButtonTypes().setAll(ButtonType.OK);
    dialog.setResultConverter(ButtonType::getText);
    String result = dialog.showAndWait().orElse(null);
    System.out.println(result);
}

在上面的代码段中,result保留值OK。这几乎比使用ButtonType作为类型参数有用。如果要从Dialog获取域对象,则更惯用的方法是将事件附加到“确定”按钮,对输入执行验证并在事件处理程序中计算结果对象。该文档列出了实现该目标的三种方法。