JavaFX Dialog getResult() 方法未返回正确的泛型类型
JavaFX Dialog getResult() method not returning the right generic type
我在处理 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
不用说,代码编译完美。似乎无论何时触发 OK 按钮,对话框的值都被强制为类型 ButtonType
。不是您期望知道方法签名的类型。
如果我在显示对话框后使用getResult()
方法也是如此。
我使用 Oracle 的 JVM 1.8.0_151.
感谢您的任何见解。
如果类型不是 Void
或 ButtonType
,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
获取域对象,更惯用的方法是将事件附加到 OK 按钮,对输入执行验证并在事件处理程序中计算结果对象。该文档列出了实现该目标的三种方法。
我在处理 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
不用说,代码编译完美。似乎无论何时触发 OK 按钮,对话框的值都被强制为类型 ButtonType
。不是您期望知道方法签名的类型。
如果我在显示对话框后使用getResult()
方法也是如此。
我使用 Oracle 的 JVM 1.8.0_151.
感谢您的任何见解。
如果类型不是 Void
或 ButtonType
,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
获取域对象,更惯用的方法是将事件附加到 OK 按钮,对输入执行验证并在事件处理程序中计算结果对象。该文档列出了实现该目标的三种方法。