프로그래밍 언어/JAVA

모달 다이얼로그와 모달리스 다이얼로그

· 코딩마이데이

다이얼로그의 타입은 모달(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();
	}
}

 

[실행결과]

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

파일 다이얼로그  (0) 2025.09.12
팝업 다이얼로그  (1) 2025.09.09
다이얼로그 만들기  (0) 2025.09.03
툴팁  (0) 2025.09.02
툴바  (1) 2025.08.31