Scene에는 다양한 컨트롤이 포함되는데, 이들을 배치하는 것을 Layout(레이아웃) 이라 한다.
JavaFX에서 레이아웃을 작성하는 방법은 2가지가 있다.
자바 코드로 UI 컨트롤을 배치
XML기반 마크업 언어인 FXML로 UI 레이아웃을 태그로 선언
다음은 동일한 레이아웃을 가진 코드를 각각 프로그램적 레이아웃과 FXML 방법으로 작성한 코드이다
//root.java
package application.myapp;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class root extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
HBox hbox = new HBox(); //HBOX 컨테이너 생성
TextField textField = new TextField(); // TextField 컨트롤 생성
textField.setPrefWidth(100); // TextField 폭 설정
ObservableList list = hbox.getChildren(); // HBOX의 ObservableList 얻기
list.add(textField); // TextField 컨트롤 배치
Scene scene = new Scene(hbox); // Scene 생성
primaryStage.setScene(scene); // stage에 Scene 할당
primaryStage.show();
}
}
//root.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<HBox xmlns:fx="http://javafx.com/fxml">
<children>
<TextField>
<prefWidth>200</prefWidth>
</TextField>
</children>
</HBox>
Scene Builder를 사용하면 보다 쉽게 FXML을 작성할 수 있다.
FXML파일을 작성했다면, FXML파일을 읽어 선언된 내용을 객체화해야 한다.
FXML파일을 로딩하기 위해선 javafx.fxml.FXMLLoader 를 사용해야 한다.
Loader는 정적 메소드 load() 와 인스턴스 메소드 load()를 가지고 있다.
Parent root = FXMLLoader.load(getClass().getResources("xxx.fxml"));
FXMLLoader loader = new FXMLLoader(getClass().getResources("xxx.fxml"));
Parent root = (Parent)loader.load();
FXML 로딩 후 Parent객체를 얻었다면 다음 코드로 Scene 객체를 생성하면 된다.
Scene scene = new Scene(root);
다음은 FXML을 로딩하는 예제이다.
//FXMLTest.java
package application.myapp;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class FXMLTest extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("root.fxml"));
Scene scene = new Scene(root);
primaryStage.setTitle("ji");
primaryStage.setScene(scene);
primaryStage.show();
}
}