자바

자바 UI - Swing ( 다이얼로그)

록's 2023. 2. 20. 15:10
728x90
반응형



다이얼로그

다이얼로그(Dialog)는 주 윈도우에서 사용자의 선택 또는 입력을 위해서 띄우는 서브 윈도우이다.

다이얼로그를 띄우는 주 윈도우를 부모(parent) 윈도우 또는 소유자(owner) 윈도우라고 한다.

 

 

다이얼로그는 모달(modal)과 모달리스(modalless) 두 가지 종류가 있다.

 

모달 다이얼로그는 다이얼로그를 닫기 전까지 부모 윈도우를 사용할 수 없는 다이얼로그를 말한다.

모달리스 다이얼로그는 부모 윈도우를 계속 사용할 수 있는 다이얼로그를 말한다. 다이얼로그의 기본은 모달이다

 

다이얼로그를 띄울 때는 소유자 윈도우가 반드시 필요하다. 소유자 윈도우는 JWindow, JFrame 등이 될 수 있고, JDialog에서 또 다른 JDialog를 생성할 수 있기 때문에 JDialog도 소유자 윈도우가 될 수 있다.

 

 

사용자 정의 다이얼로그

사용자 정의 다이얼로그를 만들기 위해서는 JDialog를 상속해야 한다.

생성자는 소유자 윈도우를 받도록 선언해야 하며 소유자 윈도우를 JDialog 생성자에게 넘겨주기 위해 super(owner)를 호 출해야 한다.

 

public class MyDialog extends JDialog {
  public MyDialog(JFrame owner) {
    super(owner);
    setTitle("Title"); //다이얼로그 제목
    setSize(width, height); //다이얼로그의 크기
    setModal(true); //모달 다이얼로그(기본)
    setResizable(false); //다이얼로그의 크기를 변경하지 않도록 설정
    //우측 상단 종료 버튼 이벤트 처리
    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    //다이얼로그의 위치를 소유자 윈도우의 정중앙으로 설정
    setLocation(
      owner.getLocationOnScreen().x + (owner.getWidth()-getWidth())/2,
      owner.getLocationOnScreen().y + (owner.getHeight()-getHeight())/2
    );
  }
}

Dialog는 JFrame과 마찬가지로 우측 상단에 종료 버튼 [×]를 제공하는데, 기본 기능은 JDialog 를 화면에서 숨긴다. JDialog를 완전히 제거하고 싶다면 setDefaultCloseOperation(JDialog. DISPOSE_ON_CLOSE)를 호출하면 된다.

 

기능별 상 설명
WindowConstants.DO_NOTHING_ON_CLOSE 아무 것도 하지 않음
WindowConstants.HIDE_ON_CLOSE 화면에서 JDialog 숨김(기본)
WindowConstants.DISPOSE_ON_CLOSE 화면에서 JDialog 완전히 제거

 

보통 다이얼로그는 소유자 윈도우 중앙에 나타나므로 다이얼로그의 좌상단 좌표는 소유자 윈도우의 위치와 크기 정보를 이용해서 구할 수 있다.

int left = owner.getLocationOnScreen().x +
           (owner.getWidth()-dialog.getWidth())/2;
int top = owner.getLocationOnScreen().y +
          (owner.getHeight()-dialog.getHeight())/2;

이렇게 구한 다이얼로그의 좌상단 좌표는 JDialog의 setLocation() 메소드를 호출할 때 매개값으로 전달된다.

setLocation( left, top );

 

사용자 정의 다이얼로그를 화면에 띄우려면 소유자 윈도우를 생성자 매개값으로 제공하고, 객체를 생성한 다음 setVisible(true) 메소드를 호출하면 된다.

MyDialog jDialog = new MyDialog(jFrame);
jDialog.setVisible(true);

 

메인 윈도우에서 [다이얼로그 띄우기] 버튼을 클릭하면 모달 다이얼로그가 나타나고, [닫기] 버튼을 클릭하면 모달 다이얼로그가 사라지도록 하는 방법

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class JDialogExample extends JDialog {
	private JButton btnClose;
	
	
	// 다이얼로그 설정
	public JDialogExample(JFrame owner) {
		super(owner);
		this.setTitle("JDialogExample");
		this.setSize(300, 200);
		this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		this.setResizable(false);
		this.setModal(true);
		this.setLocation (
				owner.getLocationOnScreen().x + (owner.getWidth() - this.getWidth()) / 2,
				owner.getLocationOnScreen().y + (owner.getHeight() - this.getHeight())/ 2
		);
		this.getContentPane().add(getBtnClose(), BorderLayout.SOUTH);
	}
	
	// 남쪽 버튼 생성
	public JButton getBtnClose() {
		if(btnClose == null) {
			btnClose = new JButton();
			btnClose.setText("닫기");
			btnClose.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					JDialogExample.this.dispose();
				}			
			});
		}
		return btnClose;
	}
}
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class JFrameExample extends JFrame {
	private JButton btnOpenDialog;
	
	public JFrameExample() {
		this.setTitle("JFrame");
		this.setSize(500, 400);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().add(getBtnOpenDialog(), BorderLayout.SOUTH);
	}
	
	private JButton getBtnOpenDialog(){
		if(btnOpenDialog == null) {
			btnOpenDialog = new JButton();
			btnOpenDialog.setText("다이얼로그 띄우기");
			btnOpenDialog.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					// 다이얼로그 띄우기
					JDialogExample jDialog = new JDialogExample(JFrameExample.this);
					jDialog.setVisible(true);
				}
			});
		}
		return btnOpenDialog;
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
			JFrameExample jFrame = new JFrameExample();
			jFrame.setVisible(true);
			}
		});
	}
}

- 실행 결과 -

 

 

 

 

표준화된 다이얼로그

Swing은 자주 사용되는 표준화된 다이얼로그(MessageDialog, ConfirmDialog, InputDialog, OptionDialog )를 쉽게 생성하기 위해 JOptionPane 클래스를 제공한다.

JOptionPane의 showXXXDialog() 메소드를 호출하면 XXX 다이얼로그가 생성된다

 

showXXXDialog() 메소드는 다음과 같은 매개변수를 가지는데, 이들 매개변수로 다이얼로그의 모양을 결정지을 수 있다.

 

매개변수 설명 값의 종
Component parentComponent 소유자 윈도우 또는 null (소유자 윈도우의 중앙에 위치, null을
주면 스크린 중앙에 위치)
JWindow,
JFrame,
JDialog
Object message 텍스트 메시지 String
String title 다이얼로그 제목 String
int optionType 버튼 집합 결정
JOptionPane의 상수 이용
OK_CANCEL_OPTION
YES_NO_OPTION
YES_NO_CANCEL_OPTION
int messageType 표준 아이콘 설정 JOptionPane의 상수 이용 PLAIN_MESSAGE
INFORMATION_MESSAGE
QUESTION_MESSAGE
WARNING_MESSAGE
ERROR_MESSAGE
con icon 사용자 정의 아이콘 설정 ImageIcon
Object[] selectionValues InputDialog에서 사용됨. 항목이 12 개 미만이면 JComboBox가 사용 됨. 항목이 12개 이상이면 JList가 사 용됨 String[ ]
Icon[ ]
Object initialSelectionValue InputDialog에서 초기 선택값 String, Icon
Object[] options OptionDialog의 버튼들에 표시되는 텍스트 또는 이미지 String[ ]
Icon[ ]
Object initialValue 초기 포커스를 갖는 버튼의 텍스트 또 는 이미지 String
Icon

showMessageDialog() 메소드를 제외하고 나머지 세 개의 showXXXDialog() 메소드는 모두 리턴값이 있다.

리턴값은 어떤 버튼이 클릭되었는지, 입력된 값이 무엇인지에 대한 정보를 담고 있다.

 

 

  • ConfirmDialog는 어떤 버튼이 클릭되었는가가 중요하기 때문에 showConfirmDialog() 메소드는 클릭된 버튼에 해당하는 int 타입의 JOptionPane 상수를 리턴한다.

  • InputDialog는 입력된 값이 중요하기 때문에 showInputDialog() 메소드는 입력 컴포넌 트가 JTextField이면 String을 리턴하고, JList나 JComboBox라면 선택된 Object를 리턴 한다.
  • OptionDialog는 어떤 버튼이 클릭되었는지가 중요하기 때문에 showOptionDialog() 메 소드는 매개값으로 주어진 options 배열에서 클릭된 버튼의 인덱스를 리턴한다.

 

 

표준 다이얼로그들을 생성하는 방법과 showXXXDialog() 메소드의 리턴값을 이용 하는 방법

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;
	private JButton 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(500, 300);
	}
	
	public JButton getBtnMessage() {
		if(btnMessage == null) {
			btnMessage = new JButton();
			btnMessage.setText("MessageDialog");
			btnMessage.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					// MessageDialog를 보여줌
					JOptionPane.showMessageDialog(
							JOptionPaneExample.this, "다이얼로그 텍스트 내용", "INFORMATION_MESSAGE",
							JOptionPane.INFORMATION_MESSAGE);
				}			
			});
		}
		return btnMessage;
	}
	
	
	// ConfirmDialog를 보여주는 버튼 생성
	public JButton getBtnConfirm() {
		if(btnConfirm == null) {
			btnConfirm = new JButton();
			btnConfirm.setText("ConfirmDialog");
			btnConfirm.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					// ConfirmDialog를 보여줌
					int option = JOptionPane.showConfirmDialog(
							JOptionPaneExample.this,
							"다이얼로그 텍스트 내용",
							"OK_CANCEL_OPTION",
							JOptionPane.OK_CANCEL_OPTION,
							JOptionPane.PLAIN_MESSAGE,
							null);
					// 클릭된 버튼 확인하기
					if(option == JOptionPane.OK_OPTION) {
						System.out.println("확인 버튼을 눌렀군요");
					} else if(option == JOptionPane.CANCEL_OPTION) {
						System.out.println("취소 버튼을 눌렀군요");
					} else if (option == JOptionPane.CLOSED_OPTION) {
						System.out.println("닫기 버튼을 눌렀군요");
					}
				}
			});
		}
		return btnConfirm;
	}
	
	// InputDialog를 보여주는 버튼 생성
	public JButton getBtnInput() {
		if(btnInput == null) {
			btnInput = new JButton();
			btnInput.setText("InputDialog");
			btnInput.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					String input = null;
					
					// 텍스트 입력을 받는 InputDialog를 보여줌
					input = JOptionPane.showInputDialog(
							JOptionPaneExample.this,
							"다이얼로그 텍스트 내용",
							"InputDialog",
							JOptionPane.INFORMATION_MESSAGE);
					
					// 선택된 항목을 출력
					System.out.println("입력된 텍스트: " + input);
					
					// JComboBox로 항목을 선택 받는 InputDialog를 보여줌
					input = (String) JOptionPane.showInputDialog(
							JOptionPaneExample.this,
							"다이얼로그 텍스트 내용",
							"InputDialog",
							JOptionPane.PLAIN_MESSAGE,
							null,
							new String[] {"Java", "JDBC", "JSP", "Spring"},
							"JDBC");
					// 선택된 항목을 출력
					System.out.println("선택된 항목: " + input);
				}
			});
		}
		return btnInput;
	}
	
	//OptionDialog를 보여주는 버튼 생성
	public JButton getBtnOption() {
		if(btnOption == null) {
			btnOption = new JButton();
			btnOption.setText("OptionDialog");
			btnOption.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					//OptionDialog를 보여줌
					int option = JOptionPane.showOptionDialog(
						JOptionPaneExample.this,
						"다이얼로그의 텍스트 내용",
						"OptionDialog",
						JOptionPane.YES_NO_OPTION,
						JOptionPane.INFORMATION_MESSAGE,
						null,
						new String[] {"시작", "종료"},
						"시작");
					//클릭된 버튼 확인하기
					if(option == 0) {
						System.out.println("시작 버튼을 눌렀군요");
					} else if(option == 1) {
						System.out.println("종료 버튼을 눌렀군요");
					}
				}
			});
		}
		return btnOption;
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
			JOptionPaneExample jFrame = new JOptionPaneExample();
			jFrame.setVisible(true);
			}
		});
	}
}

 

- 실행 결과 -

 

 

 

 

파일 다이얼로그

UI 프로그램에서 파일 다이얼로그는 사용자가 파일을 선택할 때 사용한다.

Swing은 파일 다이 얼로그를 위해 JFileChooser를 제공하는데, showOpenDialog ( )와 showSaveDialog ( ) 메소드를 이용해서 열기와 저장용 파일 다이얼로그를 띄울 수 있다.

showOpenDialog ( )와 showSaveDialog()의 매개값은 소유자 윈도우이다.

 

JFileChooser jFileChooser = new JFileChooser();
jFileChooser.showOpenDialog(jFrame); 또는 jFileChooser.showSaveDialog(jFrame);

 

 

 

파일 다이얼로그의 기본 디렉토리 위치는 사용자의 홈 디렉토리인데, 변경하고 싶다면 setCurrentDirectory() 메소드를 이용

jFileChooser.setCurrentDirectory(new File("C:/Temp"));

 

파일 종류는 JComboBox로 선택할 수 있는데, 기본적으로 ‘모든 파일’ 항목만 있다. 파일 종류는 FileNameExtensionFilter 객체를 생성하고, addChoosableFileFilter() 메소드로 추가할 수 있다.

 

jFileChooser.addChoosableFileFilter(
		new FileNameExtensionFilter("텍스트 파일(*.txt)", "txt"));

showOpenDialog()와 showSaveDialog() 메소드는 모두 int 값을 리턴한다. 어떤 버튼이 눌러졌는지 구분할 용도로 사용되는데, 다음 상수값 중 하나를 리턴한다

 

 

옵션 상수
APPROVE_OPTION [열기], [저장] 버튼을 클릭했을 때
CANCEL_OPTION [취소], [x] 버튼을 클릭했을 때

 

JFileChooser.APPROVE_OPTION을 리턴했다면 사용자가 파일을 선택하고, [열기] 또는 [저 장] 버튼을 클릭한 경우,

int option = jFileChooser.showOpenDialog(jFrame);
   if(option = = JFileChooser.APPROVE_OPTION) {
   //[열기] 버튼을 눌렀을 경우 실행할 코드
   } else {
  //[취소], [닫기] 버튼을 눌렀을 경우 실행할 코드
}

사용자가 선택한 파일은 JFileChooser의 getSelectedFile() 메소드로 알 수 있는데, 리턴값은 파일 경로 정보가 있는 java.io.File 객체이다.

 

File file = jFileChooser.getSelectedFile();
System.out.println("선택한 파일 절대 경로: " + file.getAbsolutePath());
System.out.println("선택한 파일 이름: " + file.getName());

 

파일 종류를 추가한 파일 다이얼로그를 보여주고, 어떤 버튼을 선택했는지에 따라 선택 한 파일의 경로를 출력 방법

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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 btnFileOpen, btnFileSave;
	
	//메인 윈도우 설정
	public JFileChooserExample() {
		this.setTitle("JFileChooserExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().setLayout(new GridLayout(2, 1));
		this.getContentPane().add(getBtnFileOpen());
		this.getContentPane().add(getBtnFileSave());
		this.setSize(150, 100);
	}
	
	// 열기 버튼 생성
	public JButton getBtnFileOpen() {
		if(btnFileOpen == null) {
			btnFileOpen = new JButton();
			btnFileOpen.setText("File Open");
			btnFileOpen.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					// 파일 열기 다이얼로그 보여주기
					JFileChooser jFileChooser = new JFileChooser();
					jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter(
							"그림파일(*.jpg, *.gif, *.bmp)", "jpg", "gif", "bmp"));
					jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter(
							"텍스트 파일(*.txt)", "txt"));
					int option = jFileChooser.showOpenDialog(JFileChooserExample.this);
					// 어떤 버튼을 클릭했는지 확인하기
					if(option == JFileChooser.APPROVE_OPTION) {
						File file = jFileChooser.getSelectedFile();
						System.out.println("열어야 할 파일 절대경로: " + file.getAbsolutePath());
						System.out.println("열어야 할 파일 이름: " + file.getName());						
					} else if (option == JFileChooser.CANCEL_OPTION) {
						System.out.println("취소 또는 닫기를 눌렀군요");
					}
				}
			});
		}
		return btnFileOpen;
	}
	
	// 저장버튼 생성
	public JButton getBtnFileSave() {
		if(btnFileSave == null) {
			btnFileSave = new JButton();
			btnFileSave.setText("File Save");
			btnFileSave.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					// 파일 저장 다이얼로그 보여주기
					JFileChooser jFileChooser = new JFileChooser();
					jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter(
							"그림파일(*.jpg, *.gif, *.bmp)\", \"jpg\", \"gif\", \"bmp\""));
					jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter(
							"텍스트 파일(*.txt)", "txt"));
					int option = jFileChooser.showSaveDialog(JFileChooserExample.this);
					// 어떤 버튼을 클릭했는지 확인하기
					if (option == JFileChooser.APPROVE_OPTION) {
						File file = jFileChooser.getSelectedFile();
						System.out.println("저장할 파일: " + file.getAbsolutePath());
					} else if (option == JFileChooser.CANCEL_OPTION) {
						System.out.println("취소 또는 닫기를 눌렀군요");
					}
				}
			});
		}
		return btnFileSave;
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
			JFileChooserExample jFrame = new JFileChooserExample();
			jFrame.setVisible(true);
			}
		});
	}
}

- 실행 결과 -

 

 

 

 

색상 다이얼로그

색상 다이얼로그를 이용하면 색상을 사용자가 선택할 수 있다.

Swing은 색상 다이얼로그를 위해 JColorChooser를 제공하는데, showDialog() 메소드를 이용해서 색상 다이얼로그를 띄울 수 있다.

 

JColorChooser jColorChooser = new JColorChooser();
Color color = jColorChooser.showDialog(jFrame, "색상 선택", null);

첫 번째 매개값은 소유자 윈도우이고,

두 번째 매개값은 색상 다이얼로그의 제목이다.

세 번째 매개 값은 미리보기 색상에 해당하는 Color 객체를 주면 되는데, 만약 null을 주면 미리보기 색상은 하 얀색이 된다. JColorChooser는 색상을 선택할 수 있도록 여러 가지 탭을 제공하고 있다.

색상을 결정하고 나서 [확인] 버튼을 클릭하면 사용자가 선택한 색상은 Color 객체로 생성되고, showDialog() 메소드의 리턴값으로 나온다.

 

 

 

색상 다이얼로그에서 선택한 색상을 버튼의 배경색으로 설정하는 방법

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class JColorChooserExample extends JFrame {
	private JButton btnColor;
	
	// 메인 윈도우 설정
	public JColorChooserExample() {
		this.setTitle("JColorChooserExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().setLayout(new GridLayout(1,1));
		this.getContentPane().add(getBtnColor());
		this.setSize(150, 60);
	}
	
	// 색상 버튼
	public JButton getBtnColor() {
		if (btnColor == null) {
			btnColor = new JButton();
			btnColor.setText("JColorChooser");
			btnColor.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					//색상 다이얼로그 보여주기
					Color color = JColorChooser.showDialog(
						JColorChooserExample.this, "색상 선택", Color.BLUE);
					// 버튼의 배경색을 변경
					btnColor.setBackground(color);
				}
			});
		}
		return btnColor;
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
			JColorChooserExample jFrame = new JColorChooserExample();
			jFrame.setVisible(true);
			}
		});

	}

}

 

-  실행 결과 -




728x90
반응형