2 回答

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

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
這取決于您如何使用 FXMLLoader。有靜態(tài)和非靜態(tài)加載方法,還有可以提供控制器實(shí)例的方法。最好查看 FXMLLoader 類文檔中的各種加載方法。
添加回答
舉報(bào)