2016-11-11 263 views
0

如果我有一個使用FXML的JavaFX項目,我將如何構建它以遵守模型 - 視圖 - 控制器模式?這就是我所假設的一般結構是這樣的:MVC與JavaFX和FXML

模型 - 基礎程序(GUI所代表的)。
查看 - FXML文件。
控制器 - FXML控制器。

此表示法的問題是無法通知視圖模型的更改,因爲它只是一個FXML文件。該視圖應該是FXML控制器類,然後是否應該有一個主控制器類,以便FXML控制器從模型中獲取信息,並由主控制器處理動作事件?在這種情況下,主控制器如何訪問JavaFX節點?

另外,在MVC模式中,主要方法應該在哪裏?現在,它在我的JavaFX應用程序類中,然後對程序的其餘部分不做任何處理。另外,JavaFX應用程序類應該是MVC模式的一部分,還是隻需要初始化GUI?

摘要的問題(請儘管閱讀全文後):

  1. 如何構建它使用FXML堅持MVC模式我的JavaFX項目?該視圖應該是FXML控制器類,然後是否應該有一個主控制器類,以便FXML控制器從模型中獲取信息,並由主控制器處理動作事件?
  2. 在MVC模式中,主要方法應該在哪裏?
  3. JavaFX應用程序類應該是MVC模式的一部分,還是隻需要初始化GUI?
+0

如果您儘量將您的GUI代碼與狀態和邏輯代碼解耦,那麼您會發現您的應用程序非常類似於MVC,因爲MVC所追求的問題是分離的。這可能是實現你想去的地方的最實用的方式,因爲實際上並不是真正的MVC路徑。 – NESPowerGlove

+0

另請參閱http://stackoverflow.com/questions/32342864/applying-mvc-with-javafx和http://stackoverflow.com/questions/23187932/mvc-with-javafx?rq=1 –

回答

3

如何構建它使用FXML堅持 MVC模式我的JavaFX項目?如果視圖是FXML控制器類,那麼我應該有一個主控制器類,以便FXML控制器 從模型獲取信息,並且主控制器處理動作事件 ?

JavaFX和Swing都推動了視圖和控制器之間的緊密耦合,並證明使通用控制器很困難。但是,MVC本身有一些解釋,所以它有點模糊。

鑑於視圖和控制器緊密耦合的理由,您有一些選擇。我會建議兩個,也許其他人可以添加,甚至不同意。

1)接受View類僅僅是加載FXML文件的虛擬設置,設置SceneStage,使得FXMLController類觀察模型並更新視圖。

這將控制器限制爲JavaFXML應用程序,這意味着它不能與Swing輕鬆交換。儘管只要它引用了正確的Controller,並且所有onAction或等效的Node屬性都使用相同的引用,更改視圖就很快且簡單。

2)不要使用提供的骨架代碼。相反,View會手動加載FXML文件並訪問Nodes,另外還會從FXML文件中刪除fx:controller屬性,並從FXML文件中的相關節點中刪除onAction屬性。

然後,您可以根據需要從視圖中的FXML訪問任何Node,例如,

Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 
Button example = (Button) root.lookup("#button"); // #button exists in FXMLDocument.fxml 
example.setOnAction(e -> { myController.doSomething(); }); 

這給你的優勢或指定你自己的通用控制器,並允許View類觀察模型本身。

在一天結束時,最重要的是將模型從視圖和控制器中分離出來,因爲模型是程序的肉。 Smart Model, Thin Controller, Dumb View

主要方法應該在哪裏?

沒關係。但是,如果創建的JAR是由JavaFX Packager工具完成的,則JavaFX應用程序並不嚴格需要main方法,而是使用launch作爲入口點。但是,您可以使用main方法作爲單獨課程的入口點,並改爲撥打Application.launch(MyJavaFXApplicationClass.class);

如果JavaFX應用程序類是MVC模式的一部分,或者是 它只需要初始化GUI?

是的,因爲它是視圖的一部分。看看我上面提到的兩種方法。

+0

因此,應用程序類將參考模型,觀察變化,並在必要時修改視圖? – Kootling

+0

我同意'JavaFX和Swing都推動View和Controller之間的緊密耦合,控制器幾乎感覺像是FXML文件的「支持」類。 –

0

在我看來,如果每個以JavaFX開頭的人都試圖發明自己的MVC變體實現方案,那麼這並不是很有幫助。相反,應該從許多已經存在的應用程序框架(對於JavaFX)中選擇一個,嘗試理解它,然後嚴格遵循此框架的指導原則來構建應用程序。 我個人最喜歡的是mvvmFX,但當然你也可以使用AfterburnerFX等其他人之一。學習和使用這樣的框架可以回答許多關於SO的常見問題。