[JavaFX 가이드] 2. 메인 클래스

j_huuuunS·2023년 1월 16일
0

JavaFX 가이드

목록 보기
2/4
post-thumbnail

1. Application 구성 요소

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

2. 메인 클래스

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();
    }
}

메인 클래스 실행을 위해선 다음과 같은 단계가 필요하다.

  1. 추상 클래스인 javafx.application.Application을 상속
  2. start() 메소드 재정의
  3. launch() 메소드 호출

각 메소드별 역할

  • launch() -> 메인 클래스 객체, 메인 윈도우 생성, start() 호출
  • start() -> 메인 윈도우 실행
  • init() -> 매개값을 App이 이용할 수 있게 가져옴
  • stop() -> App이 종료되기 전 자원 정리

3. launch() 메소드의 스레드 생성

JavaFX API는 스레드에 안전하지 않다

멀티 스레드가 동시에 UI를 생성하거나 수정하면 문제가 발생한다. 따라서 launch() 메소드는 실행 시 두 개의 스레드를 생성하고 시작시킨다

  • JavaFX-Launcher: init() 실행
  • JavaFX Application Thread: Stage-UI 생성 및 수정, 입력 이벤트 처리

다음 예제는 기본 생성자, 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);
    }
}

실행 결과

4.Stage(무대), Scene(장면)

윈도우를 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) 에 기초하여 작성한 글입니다.
깃허브

profile
한줄

0개의 댓글