2 回答

TA貢獻1875條經驗 獲得超3個贊
了解這FXMLLoader
不是框架,盡管它可以用作框架的基礎。沒有容器來管理控制器類的實例或加載的根。由 所創建的對象會發生什么FXMLLoader
由應用程序代碼決定。
FXML 文件只是描述對象圖的 XML 格式的文本文件。簡單FXMLLoader
地解釋該文件并創建所述對象圖1。當然,FXML 格式有一些專門添加的語法來處理 JavaFX 的特定功能(例如添加事件處理程序、綁定等)。
1)加載新的 FXML 時,FXML 使用的類(或者更確切地說,特定控制器)是否也被實例化/加載?
如果您fx:controller
在 FXML 文件的根元素中有一個屬性,那么是的,將創建指定控制器類的新實例(默認情況下)。FXML 文件描述的所有對象也是如此。換句話說,每次加載 FXML 文件時,都會FXMLLoader
返回根和控制器的新實例。控制器實例的創建方式可以通過controllerFactory
在FXMLLoader
.
如果您沒有fx:controller
屬性,那么要么沒有控制器實例,要么您需要以編程方式指定一個。在這種情況下,您手動提供控制器實例。
注意:永遠不要在不同的 FXML 文件之間共享控制器類,也不要在不同的負載之間共享控制器實例。這樣做會引起各種混亂,并且不必要地復雜。也就是說,擁有一個公共抽象類可能是合適的,只要它只有每個子類共有的狀態和行為。
2) 執行此操作時,如果實例化/加載了新的 FXML 類,是否從內存中釋放了先前的 FXML 類?還是它仍在使用內存。
如本答案開頭所述,FXMLLoader
簡單地解釋 FXML 文件并創建適當的對象圖1。一旦它這樣做了,創建的對象會發生什么就取決于你了。只要對象可以被任何線程強訪問,它們就不會被垃圾回收。
如果你問如果你重用一個實例會發生什么FXMLLoader
,我不完全確定,因為我從來沒有嘗試過。FXMLLoader
可以這么說,我建議您每次要加載 FXML 文件(或使用靜態load(URL)
方法)時都創建一個新實例。
1. 創建對象圖后,如果存在控制器,則還將FXMLLoader
注入任何適當的字段并“鏈接”所有適當的方法。

TA貢獻1936條經驗 獲得超7個贊
這取決于您如何使用 FXMLLoader。有靜態和非靜態加載方法,還有可以提供控制器實例的方法。最好查看 FXMLLoader 類文檔中的各種加載方法。
添加回答
舉報