亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

加載 FXML 文件時,是否也加載了關聯的控制器

加載 FXML 文件時,是否也加載了關聯的控制器

至尊寶的傳說 2023-06-08 19:18:16
我已經為 ScreenController 類(一個由每個屏幕的單獨控制器類擴展的類)創建了一個解決方案,它將處理我的應用程序中的基線屏幕層次結構。在我的課程中,我使用一個函數將另一個 FXML 文件的內容添加(加載)到當前控制器的當前 AnchorPane 中。我的問題是:1)加載新的 FXML 時,FXML 使用的類(或者更確切地說,特定控制器)是否也被實例化/加載?2) 執行此操作時,如果實例化/加載了新的 FXML 類,是否從內存中釋放了先前的 FXML 類?還是它仍在使用內存。屏幕轉換代碼:public void setScreen(String screen) throws Exception{    Parent root = FXMLLoader.load(getClass().getResource(screen));    window.getChildren().setAll(root);}
查看完整描述

2 回答

?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

了解這FXMLLoader不是框架,盡管它可以用作框架的基礎。沒有容器來管理控制器類的實例或加載的根。由 所創建的對象會發生什么FXMLLoader由應用程序代碼決定。

FXML 文件只是描述對象圖的 XML 格式的文本文件。簡單FXMLLoader地解釋該文件并創建所述對象圖1。當然,FXML 格式有一些專門添加的語法來處理 JavaFX 的特定功能(例如添加事件處理程序、綁定等)。


1)加載新的 FXML 時,FXML 使用的類(或者更確切地說,特定控制器)是否也被實例化/加載?

如果您fx:controller在 FXML 文件的根元素中有一個屬性,那么是的,將創建指定控制器類的新實例(默認情況下)。FXML 文件描述的所有對象也是如此。換句話說,每次加載 FXML 文件時,都會FXMLLoader返回根和控制器的新實例。控制器實例的創建方式可以通過controllerFactoryFXMLLoader.

如果您沒有fx:controller屬性,那么要么沒有控制器實例,要么您需要以編程方式指定一個。在這種情況下,您手動提供控制器實例。

注意:永遠不要在不同的 FXML 文件之間共享控制器類,也不要在不同的負載之間共享控制器實例。這樣做會引起各種混亂,并且不必要地復雜。也就是說,擁有一個公共抽象類可能是合適的,只要它只有每個子類共有的狀態和行為。


2) 執行此操作時,如果實例化/加載了新的 FXML 類,是否從內存中釋放了先前的 FXML 類?還是它仍在使用內存。

如本答案開頭所述,FXMLLoader簡單地解釋 FXML 文件并創建適當的對象圖1。一旦它這樣做了,創建的對象會發生什么就取決于你了。只要對象可以被任何線程強訪問,它們就不會被垃圾回收。

如果你問如果你重用一個實例會發生什么FXMLLoader,我不完全確定,因為我從來沒有嘗試過。FXMLLoader可以這么說,我建議您每次要加載 FXML 文件(或使用靜態load(URL)方法)時都創建一個新實例。


1. 創建對象圖后,如果存在控制器,則還將FXMLLoader注入任何適當的字段并“鏈接”所有適當的方法。


查看完整回答
反對 回復 2023-06-08
?
LEATH

TA貢獻1936條經驗 獲得超7個贊

這取決于您如何使用 FXMLLoader。有靜態和非靜態加載方法,還有可以提供控制器實例的方法。最好查看 FXMLLoader 類文檔中的各種加載方法。



查看完整回答
反對 回復 2023-06-08
  • 2 回答
  • 0 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號