권장 접근법
이 답변은 FXML 컨트롤러에 매개 변수를 전달하기위한 다양한 메커니즘을 열거합니다.
소규모 응용 프로그램의 경우 호출자에서 컨트롤러로 직접 매개 변수를 전달하는 것이 좋습니다. 간단하고 간단하며 추가 프레임 워크가 필요하지 않습니다.
더 크고 복잡한 응용 프로그램의 경우 응용 프로그램 내에서 Dependency Injection 또는 Event Bus 메커니즘 을 사용하려는 경우 조사하는 것이 좋습니다 .
발신자에서 컨트롤러로 직접 매개 변수 전달
FXML 로더 인스턴스에서 컨트롤러를 검색하고 컨트롤러에서 메서드를 호출하여 필요한 데이터 값으로 초기화하여 사용자 지정 데이터를 FXML 컨트롤러로 전달합니다.
다음 코드와 같은 것 :
public Stage showCustomerDialog(Customer customer) {
FXMLLoader loader = new FXMLLoader(
getClass().getResource(
"customerDialog.fxml"
)
);
Stage stage = new Stage(StageStyle.DECORATED);
stage.setScene(
new Scene(
(Pane) loader.load()
)
);
CustomerDialogController controller =
loader.<CustomerDialogController>getController();
controller.initData(customer);
stage.show();
return stage;
}
...
class CustomerDialogController {
@FXML private Label customerName;
void initialize() {}
void initData(Customer customer) {
customerName.setText(customer.getName());
}
}
새로운 FXMLLoader는 샘플 코드에 표시된대로 구성됩니다 new FXMLLoader(location). 위치는 URL이며 다음과 같은 방법으로 FXML 리소스에서 이러한 URL을 생성 할 수 있습니다.
new FXMLLoader(getClass().getResource("sample.fxml"));
FXMLLoader에서 정적로드 기능을 사용하지 않도록주의하십시오. 그렇지 않으면 로더 인스턴스에서 컨트롤러를 가져올 수 없습니다.
FXMLLoader 인스턴스 자체는 도메인 개체에 대해 전혀 알지 못합니다. 대신 응용 프로그램 특정 도메인 개체를 FXMLLoader 생성자로 직접 전달하지 않습니다.
- 지정된 위치에서 fxml 마크 업을 기반으로 FXMLLoader 생성
- FXMLLoader 인스턴스에서 컨트롤러를 가져옵니다.
- 검색된 컨트롤러에서 메소드를 호출하여 컨트롤러에 도메인 오브젝트에 대한 참조를 제공하십시오.
이 블로그 (다른 작가의)는 대안이지만 유사한 예제를 제공 합니다.
FXMLLoader에서 컨트롤러 설정
CustomerDialogController dialogController =
new CustomerDialogController(param1, param2);
FXMLLoader loader = new FXMLLoader(
getClass().getResource(
"customerDialog.fxml"
)
);
loader.setController(dialogController);
Pane mainPane = (Pane) loader.load();
호출자에서 원하는 매개 변수를 컨트롤러 생성자로 전달하여 코드로 새 컨트롤러를 구성 할 수 있습니다. 컨트롤러를 생성 한 후에 는 인스턴스 메서드 를 호출 하기 전에 FXMLLoader 인스턴스에서 컨트롤러를 설정할 수 있습니다 .load()
로더 (JavaFX 2.x)에서 제어기를 설정하기 fx:controller위해 fxml 파일에서 속성을 정의 할 수도 없습니다 .
fx:controllerFXML 의 정의에 대한 제한으로 인해 컨트롤러를 FXMLLoader로 설정하는 대신 FXMLLoader에서 컨트롤러를 얻는 것을 개인적으로 선호합니다.
컨트롤러가 외부 정적 메소드에서 매개 변수를 검색하도록하기
이 메소드는 Controller.java 파일의 Javafx 2.0 How-to Application.getParameters ()에 대한 Sergey의 답변으로 예시됩니다 .
의존성 주입 사용
FXMLLoader는 Guice, Spring 또는 Java EE CDI와 같은 종속성 주입 시스템을 지원하여 FXMLLoader에서 사용자 정의 컨트롤러 팩토리를 설정할 수 있습니다. 이는 각각의 의존성 주입 시스템에 의해 주입 된 의존성 값으로 컨트롤러 인스턴스를 생성하는 데 사용할 수있는 콜백을 제공합니다.
Spring을 사용한 JavaFX 애플리케이션 및 컨트롤러 종속성 주입의 예는 다음에 대한 답변으로 제공됩니다.
정말로 멋진 깨끗한 의존성 주입 방식이 예시된다 afterburner.fx 워크 시료와 공기 해킹 어플리케이션 용도 것이있다. afterburner.fx는 JEE6 javax.inject 를 사용하여 종속성 주입을 수행합니다.
이벤트 버스 이용
원래 FXML 사양 작성자이자 구현자인 Greg Brown 은 FXML 인스턴스화 된 컨트롤러와 다른 응용 프로그램 논리 간의 통신을 위해 Guava EventBus 와 같은 이벤트 버스 사용을 고려할 것을 제안 합니다.
EventBus는 POJO가 서로 참조하지 않고도 JVM의 어느 곳에서나 서로 통신 할 수 있도록하는 주석이있는 단순하지만 강력한 발행 / 구독 API입니다.
후속 Q & A
첫 번째 방법에서는 왜 Stage를 반환합니까? show () 명령을 이미 제공했기 때문에이 메소드도 무효가 될 수 있습니다. 귀국 바로 전에;. 스테이지를 반환하여 사용을 계획하는 방법
문제에 대한 기능적 솔루션입니다. 스테이지는 showCustomerDialog함수 에서 반환 되어 나중에 기본 창에서 버튼 클릭을 기반으로 스테이지를 숨기는 등의 작업을 수행하려는 외부 클래스에 의해 참조를 저장할 수 있습니다. 대체 객체 지향 솔루션은 CustomerDialog 객체 내부의 기능 및 스테이지 참조를 캡슐화하거나 CustomerDialog extend Stage를 가질 수 있습니다. FXML, 컨트롤러 및 모델 데이터를 캡슐화하는 사용자 정의 대화 상자에 대한 객체 지향 인터페이스의 전체 예는이 답변의 범위를 벗어 났지만 누구나 블로그 게시물을 작성하려는 경향이 있습니다.
@dzim 이라는 StackOverflow 사용자가 제공 한 추가 정보
스프링 부트 의존성 주입 예제
"The Spring Boot Way"를 수행하는 방법에 대한 질문에 JavaFX 2에 대한 토론이있었습니다. 이 접근 방식은 2016 년 3 월 Spring Boot v1.3.3에서 여전히 유효하고 테스트되었습니다 .RELEASE :
https://stackoverflow.com/a/36310391/1281217
때로는 결과를 발신자에게 다시 전달할 수도 있습니다.이 경우 관련 질문에 대한 답변을 확인할 수 있습니다.