gpt4 book ai didi

JavaFX-任务中的新阶段

转载 作者:行者123 更新时间:2023-12-02 11:08:52 25 4
gpt4 key购买 nike

我想从任务中打开一个新窗口,但由于某种原因,在 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 失败的原因是您正在JavaFX 应用程序线程之外的线程上创建StageStage 的 Javadoc 指出:

Stage objects must be constructed and modified on the JavaFX Application Thread.

这意味着当您尝试在运行 Task 的后台线程上创建 Stage 时,将导致 IllegalStateException一条消息告诉您您不在 JavaFX 应用程序线程上。要解决此问题,请将创建和/或修改 Stage 的所有代码封装在 Platform.runLater(Runnable) 调用中。

附注:最好不要在 Task 中创建 Stage。相反,在您的情况下,只需返回 FXMLLoader.load(URL) 的结果并在处理 Task 成功时创建 Stage 即可。

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();
};

为什么没有显示错误?

您说没有错误,但您也没有显示任何在发生错误时会显示错误的代码。当任务失败时,它会在 exception 中设置失败原因。属性(property)。要处理 Task 失败的情况,您可以:

  • 监听异常属性
  • 添加 EventHandler 来处理 WorkerStateEvent.WORKER_STATE_FAILED 事件并查询异常 属性
    • 使用 task.setOnFailed(EventHandler)task.addEventXXX(EventType, EventHandler),其中 XXXFilter处理程序
  • 重写 Task 实现中的 protected void failed() 方法并查询 exception 属性
    • failed() 方法将始终在 JavaFX 应用程序线程上调用
  • 在重新抛出之前捕获并处理 call() 方法中的异常
  • 可能是我目前没有想到的其他方式

关于JavaFX-任务中的新阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50730335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com