본문 바로가기

자바공부

자바 고급 스윙 컴포넌트, 모달 다이얼로그 & 모달리스 다이얼로그

728x90
반응형

* 다이얼로그의 타입은 모달(Modal)과 모달리스(Modaless)의 두 가지가 있다.

1) 모달 타입은 다이얼로그가 일단 출력되면 다이얼로그를 닫기 전에는 다른 작업을 전혀 할 수 없도록 사용자 입력을 독점하는 타입

2) 모달리스 타입은 다른 창과 모달리스 다이얼로그가 각자 독립적으로 작동하는 타입ㅂ

 

* 스윙 응용프로그램 작성 시에 목적에 맞는 다이얼로그 타입을 선택하여야 한다.

예를 들어, 파일을 선택하기 위한 파일 다이얼로그는 모달 타입으로 해야 한다.

파일을 선태하여 열기 전에 파일 읽기 등 다른 작업을 하게 해서는 안 되기 때문이다.

 

* 모달/모달리스 타입을 선택하기 위해서는 JDialog()의 생성자를 이용한다.

JDialog(Frame owner, String title, boolean modal)

 

생성자의 3번째 인자 modal 값에 따라 모달 타입인지 모달리스 타입인지 결정된다.

modal 값이 true이면 모달 다이얼로그가 생성되며, false이면 모달리스 타입이 생성된다.

super(frame, title, true) //true는 다이얼로그를 모달 타입으로 지정

이렇게 소스를 설정한 후 실행하면 다이얼로그를 닫기 전에는 절대로 프레임의 Show Dialog 버튼이 클릭되지 않을 것이다.

모달 다이얼로그가 모든 키나 마우스의 입력에 대한 독점권을 가지기 때문이다.

 

* 다이얼로그의 목적은 사용자로부터 입력을 받는 것이다.

 

MyDialog에 getInput() 메소드를 추가하여 MyModalDialog 클래스를 작성하였다.

getInput() 메소드는 텍스트필드 컴포넌트에 사용자가 입력한 문자열을 리턴한다.

입력된 문자열이 없는 경우에는 null을 리턴하도록 작성하였다.

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();
                bet.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);

 

* 지금까지 설명한 소스를 바탕으로 만든 Example

package Ch14ex;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class MyModalDialog extends JDialog{
	JTextField tf = new JTextField(10);
	JButton okButton = new JButton("OK");
	
	public MyModalDialog(JFrame frame, String title) {
		super(frame, title, true);
		setLayout(new FlowLayout());
		add(tf);
		add(okButton);
		setSize(200, 100);
		
		okButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				setVisible(true);
			}
		});
	}
	// 텍스트필드 창에 사용자가 입력한 문자열을 리턴한다.
	// 입력된 내용이 없으면 null을 리턴한다.
	String getInput() {
		if(tf.getText().length()==0) return null;
		else return tf.getText();
	}
	
}

public class DialogEx2 extends JFrame {
	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();
	}

}

반응형