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