2013-10-09 84 views
6

當我在JavaFX中調用FXMLLoader#load()時會發生什麼?FXMLLoader如何加載FXML的控制器?

假設FXML控制器擴展了一個具有構造函數的類。會不會保證構造函數會被調用?如果不是,將如何創建對象的新實例?例如,在下面的代碼中,將調用TextField()構造函數嗎?

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.fxml.Initializable; 
import javafx.scene.control.TextField; 
public class FXMLController extends TextField implements Initializable { 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

    }  
} 

我已經嘗試過搜索這一個,但似乎沒有關於它的文檔,除了「從FXML文檔加載對象層次結構」。從http://docs.oracle.com/javafx/2/api/javafx/fxml/FXMLLoader.html

您的回答將不勝感激。非常感謝!

回答

13

要回答你的問題「建設控制器時,什麼對FXMLLoader做什麼呢?」:

首先它會嘗試得到一個控制器實例:

  • 如果已經有一個控制器實例集在FXMLLoader上,它將使用這個實例。
  • 如果在FXMLLoader上沒有設置控制器工廠,它會嘗試爲每個反射調用類的零參數構造函數。如果失敗,則拋出InstantiationException。
  • 如果有一個控制器工廠設置,它會調用這個工廠來創建一個新的控制器實例。

越來越控制器實例後,它會用它做如下:

  • 如果這個類實現Initializable,它調用公共無效的initialize(URL網址,資源包資源包)。如果沒有,它看起來是否有一個方法稱爲零初始化並通過反射調用它。如果沒有,它什麼都不做。
+0

哇。感謝您的及時回覆。該過程聽起來很有趣。你想讓我知道你的來源嗎? –

+0

你可以很容易地測試這個行爲,你也可以在openjdk的源代碼中看到它 – Sebastian

+0

謝謝。我可能會檢查openjdk。 –

1

我不完全確定你要做什麼,但通常控制器不應該擴展文本字段。除此之外,這是基本的java東西:textfield有一個空的構造函數,你的控制器沒有,所以java將(默認情況下)調用TextField中可用的空構造函數。 TextField的構造函數將默認(即使它不在代碼中)調用它所繼承的類的構造函數等等。如果沒有調用構造函數,沒有辦法在java中構造一個對象。

+0

非常感謝您的及時回覆。我在想可能會有像控制控件的文本字段。 –