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
相关产品推荐
相关产品推荐

