
JavaFX는 레이아웃, 스타일, 로직을 분리할 수 있어 디자이너와 개발자들이 협력할 수 있는 구조를 가지고 있다.

App 실행 순서
launch() -> 생성자 -> init() -> start() -> 사용 -> exit() -> stop() -> 종료
다음은 JavaFX App의 메인 클래스 코드이다.
//AppMain.java
public class AppMain extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.show();
}
}
메인 클래스 실행을 위해선 다음과 같은 단계가 필요하다.
- 추상 클래스인 javafx.application.Application을 상속
- start() 메소드 재정의
- launch() 메소드 호출
각 메소드별 역할
- launch() -> 메인 클래스 객체, 메인 윈도우 생성, start() 호출
- start() -> 메인 윈도우 실행
- init() -> 매개값을 App이 이용할 수 있게 가져옴
- stop() -> App이 종료되기 전 자원 정리
JavaFX API는 스레드에 안전하지 않다
멀티 스레드가 동시에 UI를 생성하거나 수정하면 문제가 발생한다. 따라서 launch() 메소드는 실행 시 두 개의 스레드를 생성하고 시작시킨다
다음 예제는 기본 생성자, init(), start() stop() 메소드가 어떤 스레드에서 실행되는지 보여준다.
//ThreadTest.java
public class ThreadTest extends Application {
public AppMain(){
System.out.println(Thread.currentThread().getName()+": 생성자 호출");
}
@Override
public void init(){
System.out.println(Thread.currentThread().getName()+": init() 호출");
}
@Override
public void start(Stage primaryStage) {
System.out.println(Thread.currentThread().getName()+": start() 호출");
primaryStage.show();
}
@Override
public void stop(){
System.out.println(Thread.currentThread().getName()+": stop() 호출");
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+": main() 호출");
launch(args);
}
}
실행 결과

윈도우를 Stage로 표현, Stage는 한 번에 하나의 Scene을 가질 수 있다.
메인 Stage는 start()메소드의 primaryStage 매개값으로 전달되지만 Scene은 직접 생성해야 한다. Scene은 UI 루트 컨테이너인 javafx.scene.Parent가 필요하다.
Parent는 추상 클래스로, 하위 클래스로 객체를 생성하여 제공해야 한다. 실제로 UI컨트롤이 추가되는 곳은 Parent 가 되고, Parent의 폭과 높이는 Scene과 같다.

Scene을 생성하는 코드는 다음과 같다.
Scene scene = new Scene(Parent root);
Scene 생성 후 Stage에 올릴 땐 setScene() 메소드를 사용한다.
primaryStage.setScene(scene);
다음 예제는 VBOX를 이용하여 Scene을 생성하고 Stage에 할당해 실행하는 예제이다.
//VBoxApp.java
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class VBoxApp extends Application {
@Override
public void start(Stage primaryStage) {
VBox root = new VBox(); //Parent 하위 객체 VBOX생성
root.setPrefWidth(300); //폭
root.setPrefHeight(150); // 높이
root.setAlignment(Pos.CENTER); // 컨트롤 가운데 정렬
Label label = new Label(); // 라벨 컨트롤 생성
label.setText("Java FX"); // text 설정
label.setFont(new Font(30)); // font 설정
root.getChildren().add(label); //VBOX의 자식으로 label추가
Scene scene = new Scene(root); // VBOX를 루트 컨테이너로 하는 Scene 생성
primaryStage.setScene(scene); // Stage에 Scene할당
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
실행 결과

이 글은
신용권, 『이것이 자바다』, 한빛미디어(2015) 에 기초하여 작성한 글입니다.
깃허브