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 파일을 배치해서 이동해 보자. 그러면 제대로 창이 나타날 것이다!