[英]JavaFX Using Stage on ViewModel
我需要知道我的应用程序何时关闭。 我已经在启动JavaFX应用程序的start方法上实现了这一点:
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("/views/ClientWindow.fxml"));
primaryStage.setTitle("ClientWindow");
primaryStage.setScene(new Scene(root, 600, 400));
primaryStage.setOnCloseRequest((event) -> {
// Do my stuff with the service
service.stopService();
});
primaryStage.show();
}
现在,我需要将其更改为ViewModel,因为我需要使用start方法中定义的服务。 因此,我有两种选择:要么将服务对象传递给ViewModel,要么就从那里启动它。 我选择了第二个答案。
我的问题是:我怎么知道窗口何时关闭? 这是我在ViewModel中所做的:
// Got a Label object and used it to get the scene and stage. (Ugh.)
Stage stage = (Stage)this.labelStatus.getScene().getWindow();
// Set the OnCloseRequest event handler to do what I did in the start() method.
stage.setOnCloseRequest(event -> {
// Stop services
});
所以现在我想知道这样做是否是个好主意,因为看起来我正在忽略MVVM模型的主意。 首先,我需要使用标签作为舞台(如果我的窗口上没有标签对象,或者我真的不必在ViewModel上使用它,会发生什么情况?)。
这是我应该走的方式吗?或者有更好的方式(请参阅:更好,更直接的方式)来做到这一点?
编辑:显示定义了ModelView的FXML
看fx:controller="viewmodels.ClientWindowViewModel"
<BorderPane minHeight="400.0" minWidth="600.0" xmlns="http://javafx.com/javafx/null" xmlns:fx="http://javafx.com/fxml/1" fx:controller="viewmodels.ClientWindowViewModel">
如果您尝试遵循MVVM模式,那么应该看看能做到这一点的应用程序框架,例如mvvmFX。
https://github.com/sialcasa/mvvmFX
在您的设置中,您将控制器视为错误的视图模型。 控制器属于视图,有时也称为“代码背后”。 视图模型与视图具有一对一的关系,但在其他方面是独立的。
如果您阅读了mvvmFX的教程,您还将学习如何在视图和视图模型之间进行通信,这有望回答您的问题。
IMO将服务传递给您的控制器是一个更好的主意。
您可以调用FXMLLoader#getController()
,它将返回ClientWindowViewModel的实例。 您可以在此类中使用一种方法来设置服务
controller.setService(service);
并在获取控制器实例后从头开始调用它。
稍后,当您尝试关闭舞台时,可以调用与之前调用的方法相同的方法。
primaryStage.setOnCloseRequest((event) -> {
// Do my stuff with the service
service.stopService();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.