모달 다이얼로그와 모달리스 다이얼로그
다이얼로그의 타입은 모달(modal)과 모달리스(modeless)의 두 가지가 있습니다. 모달 타입은 다이얼로그가 일단 출력되면 다이얼로그가 일단 출력되면 다이얼로그를 닫기 전에는 다른 작업을 전혀 할 수 없도록 사용자 입력을 독점하는 타입이며, 모달리스 타입은 다른 창과 모달리스 다이얼로그가 각자 독립적으로 작동하는 타입입니다. 그러므로 모달리스 다이얼로그를 열어 놓은 채 다른 창에서 입력 작업이 가능합니다.
다이얼로그를 만들 때는 목적에 맞는 다이얼로그 타입을 결정해야 합니다. 예를 들어, 파일을 선택하는 파일 다이얼로그는 모달 타입으로 해야 합니다. 파일 선택이 끝나기 전에는 파일 읽기 등 다른 작업을 하게 해서는 안 되기 때문입니다.
모달/모달리스 타입 선택은 JDialog()의 다음 생성자를 이용합니다.
JDialog(Frame owner, String title, boolean modal)
생성자의 3번째 인자 modal 값이 true이면 모달다이얼로그가 생성되며, false이면 모달리스 타입이 생성됩니다.
super(frame, title, true); // true면 다이얼로그를 모달 타입으로 지정
생성된 MyDialog 다이얼로그를 닫기 전에는 절대로 프레임의 Show Dialog 버튼이 클릭되지 않습니다. 모달 다이얼로그가 모든 나 마우스의 입력에 대한 독점권을 가지기 때문입니다.
다이얼로그로부터 사용자 입력 값 전달받기
class MyModalDialog extends JDialog {
JTextField tf = new JTextField(10); // 다이얼로그에 텍스트필드 삽입
JButton okButton = new JButton("OK"); // 다이얼로그에 OK 버튼 삽입
public MyModalDialog(JFrame frame, String title) {
super(frame, title, true); // 모달 다이얼로그 선택(true)
setLayout(new FlowLayout());
add(tf);
add(okButton);
setSize(200, 100);
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
}
String getInput() { // 사용자가 다이얼로그에 입력한 문자열을 리턴하는 메소드
if (tf.getText().length() == 0) return null; // 텍스트필드가 빈 경우
else return tf.getText(); // 텍스트필드에 사용자가 입력한 문자열 리턴
}
}
그리고 DialogEx 프레임의 소스를 수정하여 DialogEx2 클래스를 다음과 같이 작성하였습니다.
이 코드는 사용자가 다이얼로그의 텍스트필드 창에 입력한 문자열로 프레임에 있는 Show Dialog 버튼이 문자열을 변경합니다.
public class DialogEx2 extends JFrame {
MyModalDialog dialog;
public DialogEx2() {
super("DialogEx2 예제 프레임");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 모달 다이얼로그 생성
dialog = new MyModalDialog(this, "Test Modal Dialog");
JButton btn = new JButton("Show Modal Dialog");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 모달 다이얼로그이므로 setVisible(true) 메소드는
// 다이얼로그가 닫힐 때까지 리턴하지 않는다.
dialog.setVisible(true);
String text = dialog.getInput(); // 텍스트필드에 입력한 문자열 얻음
if (text == null) return; // 텍스트필드 창이 비어 있으면 그냥 리턴
JButton btn = (JButton) e.getSource();
btn.setText(text); // 버튼의 문자열을 text로 변경
}
});
getContentPane().add(btn);
setSize(250, 200);
setVisible(true);
}
public static void main(String[] args) {
new DialogEx2();
}
}
앞의 소스에서 다이얼로그의 OK 버튼이 클릭되든지 사용자가 다이얼로그를 일방적으로 닫아버리는 경우, setVisible(true)로부터 리턴됩니다. 그리고 나서 사용자가 입력한 내용을 다이얼로그로 읽어 오기 위해 다음 코드를 이용하였습니다.
String text = dialog.getInput();
text의 값이 null이면 사용자가 아무 겂도 입력하지 않는 것이므로 단순히 리턴하도록 다음 코드를 삽입하였습니다.
if (text == null) return;
다음 코드는 text 값으로 JButton 컴포넌트의 문자열을 변경합니다.
btn.setText(text);
모달 다이얼로그로부터 사용자의 입력 값 알아내기
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MyModalDialog extends JDialog {
private JTextField tf = new JTextField(10);
private JButton okButton = new JButton("OK");
public MyModalDialog(JFrame frame, String title) {
super(frame, title, true); // true는 모달 타입을 만들도록 지시
setLayout(new FlowLayout());
add(tf);
add(okButton);
setSize(200, 100);
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false); // 다이얼로그를 닫는다. 라인 44에서 리턴하게 한다..
}
});
}
// 텍스트필드 창에 사용자가 입력한 문자열을 리턴한다.
// 입력된 내용이 없으면 null을 리턴한다.
public String getInput() {
if(tf.getText().length() == 0) return null;
else return tf.getText();
}
}
public class DialogEx2 extends JFrame{
private MyModalDialog dialog; // 다이얼로그의 레퍼런스
public DialogEx2() {
super("DialogEx2 예제 프레임");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton btn = new JButton("Show Modal Dialog");
// 모달 다이얼로그 생성
dialog = new MyModalDialog(this, "Test Modal Dialog");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.setVisible(true); // 모달 다이얼로그 작동 시작
// 다이얼로그로부터 사용자가 입력한 문자열을 받아 온다.
String text = dialog.getInput();
if(text == null) return; // 입력한 문자열이 없는 경우
JButton btn = (JButton)e.getSource();
btn.setText(text); // 입력한 문자열로 이 버튼의 문자열을 변경한다.
}
});
getContentPane().add(btn);
setSize(250,200);
setVisible(true);
}
public static void main(String[] args) {
new DialogEx2();
}
}
[실행결과]
