我想从任务中打开一个新窗口但由于某种原因,在行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;
}
};
它永远不会打印出“打印”消息。
答案 0 :(得分:1)
您的Task
失败的原因是您在JavaFX应用程序线程以外的线程上创建Stage
。 Stage
的Javadoc声明:
必须在JavaFX应用程序线程上构造和修改舞台对象。
这意味着当您尝试在后台线程上创建Stage
时,Task
正在其上运行IllegalStateException
会产生Stage
,并会显示一条消息,告知您不是&#39} ; t在JavaFX应用程序线程上。要解决此问题,请在Platform.runLater(Runnable)
调用中包装所有创建和/或修改Stage
的代码。
附注:最好不要在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();
};
。
Task
您说没有错误,但您也没有显示任何代码会在出现错误时显示错误。当Task
失败时,它会在exception
属性中设置失败原因。要处理exception
失败的情况,您可以:
EventHandler
媒体资源WorkerStateEvent.WORKER_STATE_FAILED
以处理exception
事件并查询task.setOnFailed(EventHandler)
属性
task.addEventXXX(EventType, EventHandler)
或XXX
其中Filter
为Handler
或protected void failed()
Task
实施中的exception
方法并查询failed()
属性
call()
方法
DECLARE
CURSOR contacts
IS
SELECT SUM (budget) AS budget
FROM et_bp_gl_account a, et_bp_fact f
WHERE f.gl_account_id = a.gl_account_id
AND total_flag = 0
GROUP BY month_id, org_unit_id;
BEGIN
FOR r IN contacts
LOOP
UPDATE et_bp_fact
SET budget = r.budget
WHERE gl_account_id IN (SELECT total_element
FROM et_bp_gl_account g, et_bp_fact f
WHERE f.gl_account_id = g.gl_account_id);
END LOOP;
END;
方法中的异常答案 1 :(得分:0)
你需要一个Executor来启动线程
feature/X