본문으로 건너뛰기
홈
기술
기술 전체
프로그래밍68
컴퓨터 과학63
AI48
웹 개발36
인프라33
데이터31
소프트웨어 공학18
소개
← 목록으로프로그래밍 › GUI › JavaFX

[JavaFX] 커스텀 다이얼로그

목차

[JavaFX] 커스텀 다이얼로그

Stage 클래스를 이용하여 다이얼로그를 생성할 수 있다. 기존 예제의 핵심은 새 Stage에 스타일을 정하고, 소유 창(owner)과 모달 범위를 지정한 뒤 FXML 화면을 올리는 것이다.

flowchart LR
    A[Stage 생성] --> B[owner·modality 지정]
    B --> C[FXML 로드]
    C --> D[Scene 연결]
    D --> E[show 또는 showAndWait]

StageStyle 선택

StageStyle용도
DECORATED제목 표시줄과 일반 창 장식이 있는 기본 스타일
UNDECORATED제목 표시줄과 창 장식이 없는 스타일
TRANSPARENT투명 배경과 장식 없는 창. 플랫폼 지원 확인 필요
UNIFIED창 장식과 내용 영역의 경계를 없애는 스타일. 플랫폼 지원 확인 필요
UTILITY도구 창처럼 간결한 장식의 스타일

원래 예제는 StageStyle.UNIFIED를 사용했다. 이 스타일은 플랫폼에 따라 지원되지 않으면 DECORATED로 대체될 수 있다. 시각적인 통합 효과에는 투명한 Scene 배경이 필요하다. JavaFX StageStyle 문서를 참고한다.

FXML을 담은 창 열기

다음 코드는 JavaFX 애플리케이션 스레드에서 실행되는 인스턴스 메서드의 예시다. JoinDialog.fxml이 해당 클래스와 같은 리소스 경로에 있다고 가정한다.

import java.io.IOException;
import java.net.URL;
import java.util.Objects;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

void showJoinDialog(Stage primaryStage) throws IOException {
    URL fxml = Objects.requireNonNull(
        getClass().getResource("JoinDialog.fxml"),
        "JoinDialog.fxml을 찾을 수 없습니다"
    );
    Parent root = FXMLLoader.load(fxml);

    Stage joinDialog = new Stage(StageStyle.UNIFIED);
    joinDialog.initOwner(primaryStage);
    joinDialog.initModality(Modality.WINDOW_MODAL);
    joinDialog.setTitle("회원가입");
    Scene scene = new Scene(root);
    scene.setFill(Color.TRANSPARENT);
    joinDialog.setScene(scene);
    joinDialog.setResizable(false);
    joinDialog.showAndWait();
}

initOwner()와 initModality()는 창을 표시하기 전에 호출해야 한다. WINDOW_MODAL은 소유 창 계층의 입력을 막는다. 소유 창이 없으면 기대한 모달 동작을 얻지 못할 수 있다. show()는 창을 띄우고 즉시 반환하고, showAndWait()는 창이 닫힐 때까지 호출 지점에서 기다린다. 기본 Modality는 NONE이다. JavaFX Stage 문서에 각 모달 범위와 호출 조건이 정리돼 있다.

간단한 확인·취소 대화상자라면 Dialog나 Alert도 선택지다. FXML을 사용한 별도 입력 폼처럼 화면 구성이 자유로워야 할 때 Stage가 적합하다.


참고 : 이것이 자바다