簡體   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