JavaFX-任务中的新阶段

时间:2018-06-06 22:08:11

标签: 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;
        }
    };

它永远不会打印出“打印”消息。

2 个答案:

答案 0 :(得分:1)

回答问题

您的Task失败的原因是您在JavaFX应用程序线程以外的线程上创建StageStage的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其中FilterHandlerprotected void failed()
  • 覆盖Task实施中的exception方法并查询failed()属性
    • 将始终在JavaFX Application Thread
    • 上调用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