gpt4 book ai didi

JavaFx Controller : detect when stage is closing

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:06:38 26 4
gpt4 key购买 nike

我有一个 javaFx 项目,我想在每次阶段(窗口)关闭时调用 Controller 内 的方法,以便能够在关闭它之前执行一些操作。将方法放在 Controller 中的愿望是因为要执行的操作取决于用户在使用场景时所做的选择。

我的目标是每次用户关闭舞台时,进行打印,然后执行与用户相关的操作。

我在 Controller 类中尝试:

@FXML
public void exitApplication(ActionEvent event) {
System.out.println("stop");
action();
Platform.exit();
}

但是没有效果。

最佳答案

从设计的角度来看,在 Controller 中将处理程序与舞台相关联实际上没有任何意义,因为舞台通常不是 Controller 连接到的 View 的一部分。

一种更自然的方法是在 Controller 中定义一个方法,然后在创建阶段时从与该阶段关联的处理程序调用该方法。

所以你会在 Controller 中做这样的事情:

public class Controller {

// fields and event handler methods...


public void shutdown() {
// cleanup code here...
System.out.println("Stop");
action();
// note that typically (i.e. if Platform.isImplicitExit() is true, which is the default)
// closing the last open window will invoke Platform.exit() anyway
Platform.exit();
}
}

然后在加载 FXML 时执行

FXMLLoader loader = new FXMLLoader(getClass().getResource("/path/to/file.fxml"));
Parent root = loader.load();
Controller controller = loader.getController();
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
stage.setOnHidden(e -> controller.shutdown());
stage.show();

同样,退出应用程序可能不是(或可能不应该) Controller 的责任(它是创建窗口或管理应用程序生命周期的类的责任),所以如果你真的需要强制在窗口关闭时退出,您可能会将其移至 onHidden 处理程序:

public class Controller {

// fields and event handler methods...


public void shutdown() {
// cleanup code here...
System.out.println("Stop");
action();
}
}

FXMLLoader loader = new FXMLLoader(getClass().getResource("/path/to/file.fxml"));
Parent root = loader.load();
Controller controller = loader.getController();
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
stage.setOnHidden(e -> {
controller.shutdown();
Platform.exit();
});
stage.show();

关于JavaFx Controller : detect when stage is closing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44439408/

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