[Javafx] FXML에서 컨트롤러 클래스를 자동으로 생성 할 수 있습니까?


Answers

이것은 현재 SceneBuilder, NetBeans 및 Eclipse에서 지원됩니다. 이 기능은 NetBeans 및 SceneBuilder의 기본 기능이지만 Eclipse에서는 e (fx) 클립se 플러그인이 필요합니다.

SceneBuilder : 편집기에서 FXML 파일을 연 상태에서 "View"와 "Show Sample Controller Skeleton"메뉴를 입력하십시오.

Eclipse : 내용이 코드 편집 창에 표시되도록 fxml 파일을 엽니 다 (fxml을 Eclipse 내에서 구문 강조 표시가있는 plaintext xml로보고 SceneBuilder에서 시각적으로 렌더링되지 않아야 함). Eclipse에서 코드를 마우스 오른쪽 버튼으로 클릭하고 "코드"를 선택한 다음 "컨트롤러 생성"을 선택하십시오.

NetBeans : NetBeans에서 훨씬 쉽습니다. 프로젝트 탐색기에서 fxml 파일을 마우스 오른쪽 버튼으로 클릭하고 "컨트롤러 만들기"를 선택하십시오.

Question

FXML 을 사용하여 Java FX 장면을 설명 할 때 컨트롤러 클래스를 수동으로 작성하고 멤버 변수 및 메서드를 .fxml 파일에서 참조 할 수 있습니다. FXMLLoader 사용하여 장면을로드 할 때 멤버 변수는 해당 장면 요소로 설정되고 메서드는 해당 이벤트에 자동으로 연결됩니다. 이 작업은 효과가 있지만 변경 사항이 두 곳에서 이루어져야하므로 매우 복잡하며 실수는 런타임에만 나타납니다.

필자는 장면 요소에 액세스하고 이벤트를 처리하기 위해 구현해야하는 추상 클래스로서 장면 설명에서 컨트롤러를 대신 생성 할 수있는 다른 GUI 프레임 워크를 보았습니다. 내가 의미하는 것의 예 :

다음 .fxml 파일을 생성합니다 (예 : JavaFX Scene Builder 사용 ).

<AnchorPane ... >
  <children>
     <Button fx:id="button" ... text="Button" onAction="#buttonPressed" />
  </children>
</AnchorPane>

내 빌드 과정에서 다음과 같은 .java 파일이 생성됩니다 (예 : Maven 플러그인 사용).

abstract class TestController {
    protected final Parent root;
    protected final Button button;

    {
        // Load test.fxml file
        // Assign scene elements to root and button
        // Attach event handler to the button that calls buttonClicked()
    }

    protected abstract void buttonClicked(ActionEvent event);
}

그런 다음 여러 번 해당 컨트롤러의 구체적인 구현을 만들 수 있습니다.

final class TestControllerImpl extends TestController {
    TestControllerImpl(String buttonLabel) {
        button.setText(buttonLabel);
    }

    @Override
    protected void buttonClicked(ActionEvent event) {
        button.setText("I've been clicked! What a great day!");
    }
}

이것을하기위한 목표를 가진 프로젝트가 있습니까? 아니면 FXML에 적용된이 접근 방식에 문제가 있습니까?

이 방법으로 얻을 수있는 이점은 다음과 같습니다.

  • 멤버 변수 및 컨트롤러에 대한 메서드에 대한 선언이 자동으로 생성됩니다.
  • 모든 멤버 변수는 final이 아니고 final아닌 public 또는 annotated 중 하나입니다.
  • 메서드에 대해서도 동일하지만 public 또는 annotated 대신에 보호 됩니다.
  • 메서드를 구현하지 않거나 이름을 잘못 입력하면 컴파일러 오류가 발생합니다.
  • 장면의 프로그래밍 된 설정은 장면이로드되고 요소가 멤버 변수에 할당 된 후에 생성자가 실행되기 때문에 initialize() 메서드 대신 생성자에서 수행 할 수 있습니다.



@Feuermurmel
particula .fxml 파일에 대한 자동 컨트롤러 클래스를 생성하는 방법은 없습니다.
scence builder에서 anotation @fxml 및 set (bind)을 사용하여 변수 및 메소드를 동적으로 선언해야합니다.