JavaFX-任务中的新阶段

JavaFX-任务中的新阶段,java,javafx,Java,Javafx,我想从任务中打开一个新窗口,但由于某种原因,在line Stage Stage=new Stage之后,代码停止执行,但没有错误 Task<Void> task = new Task<Void>() { @Override protected Void call() throws Exception { Parent root = FXMLLoader.load(getClass().getResource("sample2.f

我想从任务中打开一个新窗口,但由于某种原因,在line 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;
        }
    };

它从不打印消息“Print”。

您需要一个执行器来启动线程

Executor exec = Executors.newCachedThreadPool(runnable -> {
    Thread t = new Thread(runnable);
    t.setDaemon(true);
    return t;
});

exec.execute(task);
对问题的答复 任务失败的原因是,您正在JavaFX应用程序线程以外的线程上创建Stage。Stage的Javadoc声明:

必须在JavaFX应用程序线程上构造和修改阶段对象

这意味着,当您试图在后台线程上创建一个后台线程时,该线程上运行的任务将导致一个IllegalStateException,并显示一条消息,告知您不在JavaFX应用程序线程上。要解决此问题,请在Platform.runLaterRunnable调用中包装所有创建和/或修改阶段的代码

旁注:最好不要在任务中创建阶段。相反,在您的情况下,只需返回FXMLLoader.loadURL的结果,并在处理任务成功时创建阶段

为什么没有显示错误? 您说没有错误,但也没有显示任何代码,如果出现错误,这些代码将显示错误。当任务失败时,它会在属性中设置失败的原因。要处理任务失败的情况,您可以:

请听exception属性 添加EventHandler以处理WorkerStateEvent.WORKER\u STATE\u失败事件并查询异常属性 使用task.setOnFailedEventHandler或task.addEventXXXEventType,EventHandler,其中XXX是筛选器或处理程序 在任务实现中重写受保护的void failed方法并查询exception属性 失败的方法将始终在JavaFX应用程序线程上调用 在调用方法中捕获并处理异常,然后再重新抛出它 可能是我目前没有想到的其他方式
没用。以前,我通过“task.run;”运行任务。两者的效果相同。要获取错误,必须使用task.setOnFailede->{task.getException.printStackTrace;};我认为错误将出现在fxmloader.loadgetClass.getResourcesample2.fxml;,不能在threadsOk内使用静态函数,因此错误不在FX应用程序线程上;currentThread=Thread-4用于生产线阶段阶段阶段=新阶段我解决了它。我使用Platform.runLaternew Runnable{/…};代替task;。不要在后台执行此操作。如果必须尝试,请尝试将所有代码放入Platform.runlater;平台起了作用。非常感谢。
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();
};