JavaFX | FXML GUI 디자인 | FXML 로드

FXML은 당연하지만 작성만으로는 동작하지 않는다. Java 클래스 측에서 이를 로드하고 인스턴스화해서 윈도우에 포함되어 처음에 사용할 수 있게 된다. 이것은 일반적으로 Application 클래스의 start 메소드로 처리를 작성하는 작업을 한다. 그럼 FXML 이용에 흐름을 정리하자.

Pane 로드

FXML을 로드해서 Pane 인스턴스를 생성한다. 이것은 javafx.fxml 패키지에 있는 “FXMLLoader"라는 클래스를 이용한다. 이 중에 “load"클래스 메소드를 호출하는 것으로, FXML 파일을 로드하고 인스턴스를 얻을 수 있다.

FXMLLoader.load(URL)

인수에는 URL 인스턴스를 전달한다. FXML 파일이 Application 클래스와 동일한 위치에 저장되어 있는 경우, Class의 “getResource"메소드로 로드하는 것이 좋다. 즉, 아래와 같은 방식이다.

변수 = FXMLLoader.load(getClass().getResource("xxx.fxml"));

이 “xxx.fxml"에 로드할 FXML 파일 이름을 지정하면 된다. 주의 할 점은 취득되는 인스턴스이다. 이것은 Object 인스턴스에 캐스팅되어 있다. 그러므로 취득 후에 본래의 Pane 인스턴스로 변환하여 이용할 수 있다.

Scene에 추가

FXML에서 Pane 인스턴스를 취득했다면, 다음은 간단하다. Scene 인스턴스를 생성할 때 이 Pane을 인수 지정해서 Scene을 준비하고, Stage에 설정하여 사용하면 된다.

Scene 변수 = new Scene(Pane인스턴스, 폭, 높이);

Scene은 이런 식으로 인스턴스를 생성 할 수 있다. FXML를 이용해도 Pane 인스턴스만 얻을 수 있으면, 다음은 다르지 않다.

아래는 실제 사용 예제이다.

package com.devkuma.javafx;
     
import java.io.IOException;
 
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
 
public class App extends Application {
     
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override
    public void start(Stage stage) {
            BorderPane root;
            try {
                root = (BorderPane)FXMLLoader.load(getClass().getResource("app.fxml"));
                Scene scene = new Scene(root,200,100);
                stage.setScene(scene);
                stage.show();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
}

여기에서는 com.devkuma.javafx.App 클래스와 같은 위치에 “app.fxml"라는 파일명으로 FXML 파일이 배치되어 있다라는 전제에서 코드를 작성하고 있다. 실제로 이전에 FXML 파일을 배치해서 이동해 보자. 그러면 제대로 창이 나타날 것이다!