JavaFX Dialog getResult() 方法未返回正确的泛型类型

标签 java generics javafx classcastexception

我在处理 JavaFX 时遇到问题 Dialog<R>类(class)。我创建了一个带有自定义类型参数的对话框,例如 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。

感谢您提供任何见解。

最佳答案

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

@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获取域对象,更惯用的方法是将事件附加到“确定”按钮,对输入执行验证并在事件处理程序中计算结果对象。该文档列出了实现这一目标的三种方法。

关于JavaFX Dialog getResult() 方法未返回正确的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52342915/

相关文章:

java - MVC 和 JFrame

java - 混淆嵌套泛型的集合

css - 从 CSS 在 JavaFX8 中添加光照效果

java - SPARQL 在 Java 中并发查询?

java - 如何修复任务 ':app:mergeDebugResources' 执行失败

c# - 将字典转换为 List<KeyValuePair>

c# - 为 generi 方法抛出的 'Common Language Runtime detected an invalid program.' 异常需要解决方法

使用 Maven 的 JavaFX 11 抛出异常 : "WindowsNativeRunloopThread"

java - 背景鼠标光标 (JavaFX)

Java - 使用 readLine 将文件读取为二进制文件