2016-07-23 4 views
0

여러 "자식"FXML 뷰가있는 JavaFX 응용 프로그램을 개발 중입니다. 모든 아이들이 "루트"레이아웃에 액세스 할 수 있도록 노력하고 있습니다. 버튼이 RootLayout에 클릭하면(JavaFX) 컨트롤러의 이름을 모른 채 FXML 컨트롤러에 클래스 인스턴스를 전달하는 방법은 무엇입니까?

RootLayout 
    -> SubLayout1 
    -> UnknownLayout 

SubLayout1는 FXML 파일에서 생성됩니다

여기에 내 응용 프로그램의 기본 계층입니다. SubLayout1 컨트롤러 내에서

, 나는 동적으로 UnknownLayout (FXML를) 인스턴스화로드 코드와 UnknownLayoutController (관련 컨트롤러) 파일이 있습니다

FXMLLoader loader = new FXMLLoader(getClass().getResource(file.toString())); 
loader.setController(controller); 
loader.setRoot(this); 
loader.load(); 
모두 file

controller가 FXML 로딩 직전에 할당 끝 나가고있다.

동적으로 수행 중이므로 UnknownLayout 또는 해당 컨트롤러의 실제 이름이 무엇인지 알 수 없습니다.

제 문제는 RootLayout 컨트롤러의 인스턴스를 UnknownLayoutController에 전달하여 해당 컨트롤러 내의 메서드에 액세스 할 수 없다는 것입니다.

public void setRootLayoutController (RootLayoutController rootController) {} 

내가 생성자로 전달할 수 있기 때문에 SubLayout1RootController는 문제가되지 않습니다 전달 : 나는 내가 그것에 RootLayout의 컨트롤러를 전달할 수 있도록 각 UnknownLayoutController 클래스의 메소드를해야합니까. 그러나 UnknownLayout이라는 실제 이름을 모른 채 어떻게 그 방법을 호출 할 수 있습니까? FXMLLoader 블록 내에서 새 컨트롤러의 생성자를 호출하는 방법이 있습니까? 이를 수행하기위한 "모범 사례"방법은 무엇입니까?

controller 참조는 여기에 생성됩니다

StringBuilder controller = new StringBuilder(); 
controller.append(title + "Controller.java"); 

당신이 제공 할 수있는 사전에 어떤 도움을 주셔서 감사합니다!

편집 : Passing Parameters JavaFX FXML을 포함하여이 작업을 위해 여러 가지 다른 방법을 시도했지만, 내가 찾은 모든 것은 런타임 이전에 새 컨트롤러의 이름을 알고 있다고 가정합니다.

는 또한 UnknownLayoutController의 인터페이스를 구현에 보였다,하지만 난 다음이 코드는 NullPointerException 오류가 :

UnknownLayoutInterface subController = loader.getController(); 
subController.setRootController(rootController); 

controller 변수가 문제의 컨트롤러의 이름을 유지한다는 것을 String 인 ,하지만 문자열을 같은 이름의 Object로 변환하고 그런 방식으로 액세스하는 방법이 있습니까?

(이제 코드 대신 FXML fx:controller 태그에 FXMLs 컨트롤러를 정의하고 있습니다).내에서 새로운 컨트롤러의 생성자를 호출 할 수있는 방법이 있나요

Class subLayout; 
    SubLayout2Interface subInterface = null; 
    try { 
    subLayout = Class.forName([Full Package Name] + subLayoutTitle); 
    subInterface = (SubLayout2Interface) subLayout.newInstance(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
} 

subInterface.setRootController(this); 
+0

* : – fabian

답변

0

나는 내 코드를 단순화하고 (동적으로 결정되었다) 파일 이름에 따라 클래스 유형을 결정함으로써 상황을 해결할 수 있었다 FXMLLoader 블록? * 이것을 명확히 할 수 있습니까? 컨트롤러를 어떻게 만듭니 까? fxml에서`fx : controller`를 사용하고 있습니까? 팩토리/전략/명령 패턴 사용?
관련 문제