如何構建它使用FXML堅持 MVC模式我的JavaFX項目?如果視圖是FXML控制器類,那麼我應該有一個主控制器類,以便FXML控制器 從模型獲取信息,並且主控制器處理動作事件 ?
JavaFX和Swing都推動了視圖和控制器之間的緊密耦合,並證明使通用控制器很困難。但是,MVC本身有一些解釋,所以它有點模糊。
鑑於視圖和控制器緊密耦合的理由,您有一些選擇。我會建議兩個,也許其他人可以添加,甚至不同意。
1)接受View類僅僅是加載FXML文件的虛擬設置,設置Scene
和Stage
,使得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?
是的,因爲它是視圖的一部分。看看我上面提到的兩種方法。
如果您儘量將您的GUI代碼與狀態和邏輯代碼解耦,那麼您會發現您的應用程序非常類似於MVC,因爲MVC所追求的問題是分離的。這可能是實現你想去的地方的最實用的方式,因爲實際上並不是真正的MVC路徑。 – NESPowerGlove
另請參閱http://stackoverflow.com/questions/32342864/applying-mvc-with-javafx和http://stackoverflow.com/questions/23187932/mvc-with-javafx?rq=1 –