목차
[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가 적합하다.
참고 : 이것이 자바다