You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX中如何在Service任务完成后自动关闭进度窗口

JavaFX中如何在Service任务完成后自动关闭进度窗口

这个问题其实挺典型的,核心就是要让进度窗口的控制器能拿到对应窗口的Stage引用,并且在Service任务完成时触发关闭操作。我给你一步步拆解修改方案:

第一步:给进度窗口控制器添加Stage引用和设置方法

首先,在你的ProgressController里新增一个Stage类型的成员变量,再写一个设置这个Stage的方法,这样控制器就能知道要关闭哪个窗口了:

package com.example.temperature.controller;

import com.example.temperature.DataSource.GetTemperatureListService;
import javafx.fxml.FXML;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class ProgressController {

    @FXML
    private AnchorPane apPane;

    @FXML
    private ProgressIndicator piProgress;
    
    // 新增:持有进度窗口的Stage引用
    private Stage progressStage;

    // 新增:设置Stage的方法
    public void setProgressStage(Stage progressStage) {
        this.progressStage = progressStage;
    }

    public void initialize() {
        createProgress();
    }

    @FXML
    public void createProgress(){
        GetTemperatureListService service = new GetTemperatureListService();
        piProgress.progressProperty().bind(service.progressProperty());
        
        // 任务完成后关闭窗口的逻辑
        service.setOnSucceeded(event -> {
            if (progressStage != null) {
                progressStage.close();
            }
        });

        service.start();
    }
}

第二步:修改showProgressBar方法,传递Stage给控制器

接下来,在你原来的showProgressBar方法里,加载FXML之后要获取控制器实例,然后把创建好的Stage传递进去:

public void showProgressBar() throws IOException{
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("progress-view.fxml"));
    Scene scene = new Scene(fxmlLoader.load());
    
    Stage stage = new Stage();
    stage.setTitle("Caricamento");
    stage.setScene(scene);
    
    // 关键:获取进度窗口的控制器,传递Stage引用
    ProgressController controller = fxmlLoader.getController();
    controller.setProgressStage(stage);
    
    stage.show();
}

补充说明

除了用setOnSucceeded,你也可以通过监听Service的stateProperty来实现,效果是一样的:

service.stateProperty().addListener((obs, oldState, newState) -> {
    if (newState == javafx.concurrent.Worker.State.SUCCEEDED) {
        progressStage.close();
    }
});

这样一来,当Service的任务执行完成(进入SUCCEEDED状态)时,就会自动关闭进度窗口了。另外要注意,如果你需要处理任务失败的情况,也可以在setOnFailed里添加关闭窗口的逻辑,避免窗口一直挂着。

备注:内容来源于stack exchange,提问作者Daniele Asteggiante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 09:22:45