권장 접근법
이 답변은 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:controller
FXML 의 정의에 대한 제한으로 인해 컨트롤러를 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
때로는 결과를 발신자에게 다시 전달할 수도 있습니다.이 경우 관련 질문에 대한 답변을 확인할 수 있습니다.