2013-10-03 1 views
4

나는 FXMLLoader을 실험 해 보았고 구현을 사용하여 setControllerFactory 메서드를 사용했다.JavaFX 커스텀 컨트롤러 팩토리

The ORACLE documentation 말한다 다음

는 않는 것을 나타냅니다 null 값을 반환 할 수 있습니다 구현 하지 않거나 지정된 형태의 컨트롤러를 생성 할 수 없습니다 이 경우 기본 제어기 구성 메커니즘이 로더에 사용됩니다.

내가 달성하고자하는 결과는 내가 매개 변수가 필요한 컨트롤러를 생성하기 위해 의존성 주입 프레임 워크를 사용할 수 있지만 나는 FXMLLoader 부하에게 매개 변수를 필요로하지 않는 컨트롤러를 할 것입니다.

그래서

<StackPane fx:id="pane" 
      xmlns:fx="http://javafx.com/fxml" 
      fx:controller="my.package.ViewController"> 
</StackPane> 

매개 변수를 허용하지 않는 ViewController 클래스를 사용하여 다음과 같은 간단한 FXML 파일을 ...하고 난 내가 원하는 FXMLLoader에 알리기 위해 다음의 간단한 컨트롤러 공장 구현을 사용하는 경우 ViewController 클래스 n은 내 초기화의 방법 load() 방법을 호출 한 후 ...

loader.setControllerFactory(new Callback<Class<?>, Object>(){ 
    @Override 
    public Object Call(Class<?> type) { 
     return null; // Let the FXMLLoader handle construction... 
    } 
}); 

을이 경우 컨트롤러의 구성을 관리 할 수 (나는 이것을 breakpoint로 확인했다).

컨트롤러 공장 구현을 변경하여 ViewController 클래스의 인스턴스를 반환하면 모든 것이 예상대로 작동합니다.

누구든지 내 혼란을 해결할 수 있습니까? Callback 인터페이스를 잘못 사용하고 있습니까? 아니면 오라클 설명서가 올바르지 않습니까?

+0

사용중인 JavaFX의 버전은 무엇입니까? 오라클의 인용 설명에 따르면 버전 2.1에서는 유효하지 않을 수 있습니다. 2.2에서'call (Class param)'인 반면에 override 메소드는'getController (Class type)'입니다. 따라서 동작이 변경 될 수도 있으므로 버전 2.1을 사용해보십시오. –

+0

버전 2.2를 사용 중입니다. 콜백 구문의 차이점을 알았지 만 2.2 설명서에서 언급되지 않았으므로 변경된 모든 내용이 있다고 가정했습니다. 의존성 삽입 프레임 워크를 사용하여 생성자에 매개 변수가없는 컨트롤러를 만드는 것만으로도 큰 문제는 아닙니다. –

+1

다음은 [FXMLLoader JavaFX 8 소스 코드]입니다 (http://hg.openjdk.java.net/openjfx/8/master/rt/file/tip/modules/fxml/src/main/java/javafx/fxml/FXMLLoader). .자바). 2.2는 아니지만 코드의 대부분은 유사합니다. controllerFactory의 유일한 사용법은'setController (controllerFactory.call (type));'이다. 2.2에서와 같을 수도 있습니다. DI 프레임 워크를 사용하고 계신지 궁금 하신가요? –

답변

12

JavaFX는 FXMLLoader에서 다음을 수행합니다

try { 
     if (controllerFactory == null) { 
     setController(ReflectUtil.newInstance(type)); 
     } else { 
     setController(controllerFactory.call(type)); 
     } 
    } catch (InstantiationException exception) { 
     throw new LoadException(exception); 
    } catch (IllegalAccessException exception) { 
     throw new LoadException(exception); 
    } 

그래서, 그래, 오라클 튜토리얼이 올바르지 않습니다.

+0

Uluk Biy의 의견에 게시 된 버전 2.2 또는 버전 8의 내용입니까? –

+2

코드는 두 버전에서 동일합니다. – Sebastian

관련 문제