java - JavaFX-任务中的新阶段
问题描述
我想从任务中打开一个新窗口,但由于某种原因Stage stage = new Stage
,代码停止执行后,但没有错误。
Task<Void> task = new Task<Void>() {
@Override protected Void call() throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("sample2.fxml"));
Stage stage = new Stage();
System.out.println("Print");
stage.setTitle("My New Stage Title");
stage.setScene(new Scene(root, 100, 100));
stage.show();
return null;
}
};
它永远不会打印出消息“打印”。
解决方案
回答问题
您Task
失败的原因是因为您Stage
在 JavaFX 应用程序线程以外的线程上创建。Stage
各州的 Javadoc :
阶段对象必须在 JavaFX 应用程序线程上构建和修改。
这意味着当您尝试Stage
在正在运行的后台线程上创建一个时Task
,将导致IllegalStateException
一条消息告诉您您不在 JavaFX 应用程序线程上。Stage
要解决此问题,请包装在调用中创建和/或修改 a 的所有代码Platform.runLater(Runnable)
。
旁注:Stage
根本不创建in可能会更好Task
。FXMLLoader.load(URL)
相反,在您的情况下,只需Stage
在处理Task
.
Task<Parent> task = new Task<Parent>() {
@Override
protected Parent call() throws Exception {
return FXMLLoader.load(getClass().getResource("sample2.fxml"));
}
};
task.setOnSucceeded(event -> {
Parent root = task.getValue();
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.show();
};
为什么没有显示错误?
您说没有错误,但您也没有显示任何会在发生错误时显示错误的代码。当 aTask
失败时,它会在exception
属性中设置失败的原因。要处理Task
失败时的情况,您可以:
- 听
exception
楼盘 - 添加一个
EventHandler
来处理WorkerStateEvent.WORKER_STATE_FAILED
事件并查询exception
属性- 要么使用要么
task.setOnFailed(EventHandler)
在task.addEventXXX(EventType, EventHandler)
哪里XXX
要么Filter
Handler
- 要么使用要么
- 覆盖实现中的
protected void failed()
方法Task
并查询exception
属性- 该
failed()
方法将始终在 JavaFX 应用程序线程上调用
- 该
call()
在重新抛出之前捕获并处理方法中的异常- 可能我目前没有想到的其他方式
推荐阅读
- python - JupyterLab 地理地图如何工作?
- c - 使用 OR 运算符时 for() 循环中断 (C)
- scripting - 上个季度的 Pine 脚本设置时间戳不起作用
- python - 接受 Youtube 的 cookie 同意
- python - 关键错误 22,当我想删除日期时间格式的行内容时出现获取 Loc 错误
- purescript - Purescript中遍历/绑定/折叠绑定效果的区别
- c - “警告:控制到达非无效函数的结尾”在一个简单的 for 循环(GCC)中
- php - Symfony 4.4 ContainerGWHmz1B\srcApp_KernelDevDebugContainer::getParameter(string $name) 声明必须兼容
- python-3.x - 如何用不同的输出替换第一行的输出
- matlab - 在 matlab 中为 Dicom_Picture 创建像素大小