繁体   English   中英

JavaFX在ViewModel上使用舞台

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM