2013-10-09 2 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에 설정되어 있지 않으면 리플렉션마다 클래스의 0 인수 생성자를 호출하려고합니다. 이것이 실패하면 InstantiationException이 발생합니다.
  • 컨트롤러 팩토리 세트가있는 경우이 팩토리를 호출하여 새 컨트롤러 인스턴스를 만듭니다.

컨트롤러 인스턴스를받은 후, 그것은 그것으로 다음을 수행합니다 :이 클래스는 Initializable를 구현

  • 경우, 그것은 공공 무효의 초기화 (URL의 URL, ResourceBundle의 ResourceBundle을)를 호출합니다. 그렇지 않은 경우, 0 인수로 초기화하는 메소드가 있는지 확인하고 리플렉션을 통해이를 호출합니다. 그렇지 않으면 아무것도하지 않습니다.
+0

와우. 신속한 답변을 보내 주셔서 감사합니다. 이 과정은 흥미로운 것으로 들립니다. 당신의 출처를 알려주시겠습니까? –

+0

이 동작을 아주 쉽게 테스트 할 수 있으며 openjdk 소스 코드에서 볼 수도 있습니다. – Sebastian

+0

감사합니다. openjdk를 체크 아웃 할 수 있습니다. –

1

나는 무엇을 하려는지는 모르겠지만 일반적으로 컨트롤러는 텍스트 필드를 확장해서는 안됩니다.

그건 그렇고, 이것은 기본적인 자바 물건입니다 : 텍스트 필드는 빈 생성자를 가지고 컨트롤러는 아무것도 가지고 있지 않으므로 java는 (기본적으로) TextField에서 사용 가능한 빈 생성자를 호출합니다. TextField 생성자는 기본적으로 (코드에 없더라도) 확장되는 클래스의 생성자를 호출합니다. 호출되는 생성자없이 java에서 객체를 생성 할 방법이 없습니다.

+0

답장을 보내 주셔서 감사합니다. 컨트롤을 제어 할 수있는 텍스트 필드와 같은 것이있을 수 있다고 생각합니다. –