13. 다이얼로그
다이얼로그(Dialog)는 주 윈도우에서 사용자의 입력을 받거나 메시지를 전달하기 위해 띄우는 서브 윈도우입니다. 다이얼로그를 띄우는 주 윈도우를 소유자(Owner)라고 합니다.
💡 비주얼 개념 잡기: 모달(Modal)과 모달리스(Modeless)의 차이
다이얼로그의 동작 방식은 업무 환경의 서류와 포스트잇 메모에 비유할 수 있습니다!

- 모달 (Modal - 비서의 긴급 결재판): “사장님, 이 서류에 먼저 사인해 주셔야 다른 업무를 보실 수 있습니다!” 하고 불쑥 내미는 긴급 결재 서류와 같습니다. 다이얼로그를 확인하고 닫기 전까지는 뒤에 있는 주 화면(Owner Window)을 클릭하거나 조작할 수 없습니다 (입력 및 확인 강제).
- 모달리스 (Modeless - 포스트잇 메모): 모니터 옆에 살짝 붙여 두는 포스트잇 메모지와 같습니다. 메모 창이 계속 열려 있어도 주 화면의 책을 읽거나 타이핑하는 등 원래 보던 업무(주 화면 조작)를 동시에 자유롭게 진행할 수 있습니다.
1. 다이얼로그 종류
- 모달(Modal): 다이얼로그를 닫기 전까지 소유자 윈도우를 사용할 수 없음. (입력 강제)
- 모달리스(Modeless): 다이얼로그가 떠 있어도 소유자 윈도우를 계속 사용할 수 있음.
2. JDialog
사용자 정의 다이얼로그를 만들 때 JDialog를 상속받아 구현합니다.
주요 설정
public class MyDialog extends JDialog {
public MyDialog(JFrame owner) {
super(owner); // 소유자 설정
setTitle("Title");
setSize(300, 200);
setModal(true); // 모달 설정
setResizable(false);
// 위치 설정 (소유자 중앙)
setLocationRelativeTo(owner);
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); // 닫을 때 리소스 해제
}
}
소멸 상수 (setDefaultCloseOperation)
| 상수 | 설명 |
| :——————– | :—————— |
| DO_NOTHING_ON_CLOSE | 아무것도 하지 않음 |
| HIDE_ON_CLOSE | 숨김 (기본값) |
| DISPOSE_ON_CLOSE | 리소스 해제 및 제거 |
3. 표준 다이얼로그 (JOptionPane)
Swing은 자주 사용되는 다이얼로그를 JOptionPane 클래스로 제공합니다.
| 메서드 | 설명 | 버튼 구성 |
|---|---|---|
showMessageDialog |
메시지 출력 | [확인] |
showConfirmDialog |
사용자 확인 | [예/아니오] 등 |
showInputDialog |
문자열 입력 | [확인/취소] |
showOptionDialog |
사용자 정의 | [커스텀 버튼] |
매개변수
parentComponent: 다이얼로그가 뜰 위치의 기준 (null이면 화면 중앙)message: 표시할 내용title: 제목 표시줄 텍스트messageType: 아이콘 (INFORMATION,WARNING,ERROR,QUESTION,PLAIN)
리턴값 (ConfirmDialog)
YES_OPTION: 예NO_OPTION: 아니오CANCEL_OPTION: 취소CLOSED_OPTION: X 버튼
예제 (JOptionPaneExample)
- 실습 예제 파일: JOptionPaneExample.java (경로:
sample/sec13/exam02_joptionpane/JOptionPaneExample.java) - 실행 방법:
# 1. 13_dialog 디렉토리로 이동 후 컴파일 javac -d sample sample/sec13/exam02_joptionpane/JOptionPaneExample.java # 2. 실행 java -cp sample sec13.exam02_joptionpane.JOptionPaneExample
package sec13.exam02_joptionpane;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class JOptionPaneExample extends JFrame {
private JButton btnMessage, btnConfirm, btnInput, btnOption;
public JOptionPaneExample() {
this.setTitle("JOptionPaneExample");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.getContentPane().setLayout(new GridLayout(4, 1));
this.getContentPane().add(getBtnMessage());
this.getContentPane().add(getBtnConfirm());
this.getContentPane().add(getBtnInput());
this.getContentPane().add(getBtnOption());
this.setSize(400, 300);
}
public JButton getBtnMessage() {
if (btnMessage == null) {
btnMessage = new JButton("MessageDialog");
btnMessage.addActionListener(e -> {
JOptionPane.showMessageDialog(
JOptionPaneExample.this,
"알림 메시지입니다.",
"알림",
JOptionPane.INFORMATION_MESSAGE
);
});
}
return btnMessage;
}
public JButton getBtnConfirm() {
if (btnConfirm == null) {
btnConfirm = new JButton("ConfirmDialog");
btnConfirm.addActionListener(e -> {
int option = JOptionPane.showConfirmDialog(
JOptionPaneExample.this,
"진행하시겠습니까?",
"확인",
JOptionPane.OK_CANCEL_OPTION
);
if (option == JOptionPane.OK_OPTION) {
System.out.println("확인 선택");
} else {
System.out.println("취소 선택");
}
});
}
return btnConfirm;
}
public JButton getBtnInput() {
if (btnInput == null) {
btnInput = new JButton("InputDialog");
btnInput.addActionListener(e -> {
String input = JOptionPane.showInputDialog(
JOptionPaneExample.this,
"이름을 입력하세요:",
"입력",
JOptionPane.QUESTION_MESSAGE
);
System.out.println("입력값: " + input);
});
}
return btnInput;
}
public JButton getBtnOption() {
if (btnOption == null) {
btnOption = new JButton("OptionDialog");
btnOption.addActionListener(e -> {
String[] options = {"시작", "중지"};
int choice = JOptionPane.showOptionDialog(
JOptionPaneExample.this,
"작업을 선택하세요",
"옵션",
JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE,
null,
options,
options[0]
);
if (choice == 0) System.out.println("시작 선택");
else if (choice == 1) System.out.println("중지 선택");
});
}
return btnOption;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new JOptionPaneExample().setVisible(true);
});
}
}
실행 결과 화면

4. 파일 다이얼로그 (JFileChooser)
파일을 열거나 저장할 때 사용합니다.
showOpenDialog(Component): [열기] 다이얼로그,APPROVE_OPTION반환 시 선택 완료.showSaveDialog(Component): [저장] 다이얼로그.getSelectedFile(): 선택된File객체 반환.FileNameExtensionFilter: 확장자 필터링.
예제 (JFileChooserExample)
- 실습 예제 파일: JFileChooserExample.java (경로:
sample/sec13/exam03_jfilechooser/JFileChooserExample.java) - 실행 방법:
# 1. 13_dialog 디렉토리로 이동 후 컴파일 javac -d sample sample/sec13/exam03_jfilechooser/JFileChooserExample.java # 2. 실행 java -cp sample sec13.exam03_jfilechooser.JFileChooserExample
package sec13.exam03_jfilechooser;
import java.awt.GridLayout;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileNameExtensionFilter;
public class JFileChooserExample extends JFrame {
private JButton btnOpen, btnSave;
public JFileChooserExample() {
setTitle("JFileChooserExample");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(2, 1));
add(getBtnOpen());
add(getBtnSave());
setSize(300, 200);
}
public JButton getBtnOpen() {
if (btnOpen == null) {
btnOpen = new JButton("Open File");
btnOpen.addActionListener(e -> {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("텍스트 파일 (*.txt)", "txt"));
int option = fileChooser.showOpenDialog(this);
if (option == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
System.out.println("여는 파일: " + file.getAbsolutePath());
}
});
}
return btnOpen;
}
public JButton getBtnSave() {
if (btnSave == null) {
btnSave = new JButton("Save File");
btnSave.addActionListener(e -> {
JFileChooser fileChooser = new JFileChooser();
int option = fileChooser.showSaveDialog(this);
if (option == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
System.out.println("저장할 파일: " + file.getAbsolutePath());
}
});
}
return btnSave;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new JFileChooserExample().setVisible(true));
}
}
실행 결과 화면

5. 색상 다이얼로그 (JColorChooser)
색상을 선택할 수 있는 다이얼로그입니다. JColorChooser.showDialog() 정적 메서드를 사용합니다.
Color selectedColor = JColorChooser.showDialog(
parentComponent,
"색상 선택",
Color.BLUE // 초기값
);
if (selectedColor != null) {
// 색상 선택됨
component.setBackground(selectedColor);
}
이전 학습
« 32.12 툴바 컴포넌트
다음 학습
32.14 2D 그래픽스 »
서브목차