지구정복

[JAVA] 12/11 | Swing(사원정보가져오기, JDialog, ColorChooser, FileChooser, java파일불러온 뒤 다시 저장하기, JMeun, 각종 Layout, Event, 우편번호검색기) 본문

데이터 엔지니어링 정복/JAVA & JSP

[JAVA] 12/11 | Swing(사원정보가져오기, JDialog, ColorChooser, FileChooser, java파일불러온 뒤 다시 저장하기, JMeun, 각종 Layout, Event, 우편번호검색기)

eeaarrtthh 2020. 12. 11. 12:11
728x90
반응형

실습) emp 테이블에서 사원 이름 검색하면 사원정보를 가져오는 프로그램

어제 우편번호 예제에 이어서 오늘은 테이블에 사원명을 검색하면 DB 사원테이블에서 

사원번호, 사원이름, 직책, 급여, 호봉, 부서번호, 부서이름, 부서위치를 가져오는데

4개의 클래스를 이용한다.

SearchEmpUI

EmpTableModel

EmpDAO

     ArrayList<EmpTO> searchEname(String strEname)

EmpTO

     Setter/Getter

 

결과는 아래와 같다.

-SearchEmpUI

package Pack1211;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.border.TitledBorder;
import javax.swing.border.EtchedBorder;
import java.awt.Color;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;

public class SearchEmpUI1 extends JFrame {

	private JPanel contentPane;
	private JTextArea textArea;
	private JTable table;
	private JScrollPane scrollPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					SearchEmpUI1 frame = new SearchEmpUI1();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public SearchEmpUI1() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 661, 507);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, new Color(255, 255, 255), new Color(160, 160, 160)), "\uC0AC\uC6D0\uC815\uBCF4 \uAC80\uC0C9\uD558\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
		panel.setBounds(6, 10, 633, 57);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("\uC0AC\uC6D0\uC774\uB984");
		lblNewLabel.setBounds(6, 22, 57, 15);
		panel.add(lblNewLabel);
		
		textArea = new JTextArea();
		textArea.setBounds(63, 17, 455, 24);
		panel.add(textArea);
		
		//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ버튼 코딩ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
		JButton btnNewButton = new JButton("\uAC80\uC0C9");
		btnNewButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				String strEname = textArea.getText();
				if( table != null ) {
					if ( strEname.length() < 2 ) {
						JOptionPane.showMessageDialog(SearchEmpUI1.this, "2자 이상 입력해주세요", "경고", JOptionPane.WARNING_MESSAGE);
					} else {
						try {
							table.setModel( new EmpTableModel1(strEname) );
						} catch (ClassNotFoundException | SQLException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					}
				}
			}
		});
		//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ버튼 코딩ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
		btnNewButton.setBounds(530, 18, 97, 23);
		panel.add(btnNewButton);
		
		scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 78, 621, 380);
		contentPane.add(scrollPane);
		
		table = new JTable();
		scrollPane.setViewportView(table);
	}
}

-EmpTableModel

package Pack1211;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

public class EmpTableModel1 extends AbstractTableModel {
	private String[] columnNames = {"사원번호", "사원명", "직책", "급여", "호봉", "부서번호", "부서이름", "부서위치"};
	private ArrayList<EmpTO1> datas;
	
	public EmpTableModel1( String strEname ) throws ClassNotFoundException, SQLException {
		EmpDAO1 dao = new EmpDAO1();
		datas = dao.searchEname( strEname );
	}

	public String getColumnName(int column) {
		return columnNames[column];
	}

	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		return datas.size();
	}

	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return 8;
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		String result = "";
		EmpTO1 to = datas.get(rowIndex);
		switch( columnIndex ) {
		case 0:
			result = to.getEmpno();
			break;
		case 1:
			result = to.getEname();
			break;
		case 2:
			result = to.getJob();
			break;
		case 3:
			result = to.getSal();
			break;
		case 4:
			result = to.getGrade();
			break;
		case 5:
			result = to.getDeptno();
			break;
		case 6:
			result = to.getDname();
			break;
		case 7:
			result = to.getLoc();
			break;
		}
		return result;
	}
}

-EmpDAO

package Pack1211;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class EmpDAO1 {
	private ArrayList<EmpTO1> datas = new ArrayList<EmpTO1>();
	private Connection conn = null;
	
	public ArrayList<EmpTO1> searchEname( String strEname ) throws ClassNotFoundException, SQLException {
		//db 연결 정보
		String url = "jdbc:mysql://localhost:3307/sample";
		String user = "root";
		String password = "!123456";
		
		//db 드라이버 로딩
		Class.forName( "org.mariadb.jdbc.Driver" );
		this.conn = DriverManager.getConnection(url, user, password);
		
		String sql = 
		"select empno, ename, job, sal, grade, deptno, dname, loc from emp e join dept d using (deptno) join salgrade s on (sal between s.losal and s.hisal) where ename = ?";
		PreparedStatement pstmt = this.conn.prepareStatement(sql);
		pstmt.setString(1, strEname);
		ResultSet rs = pstmt.executeQuery();
		while( rs.next() ) {
			EmpTO1 data = new EmpTO1();
			data.setEmpno( rs.getString("empno") );
			data.setEname( rs.getString("ename") );
			data.setJob( rs.getString("job") );
			data.setSal( rs.getString("sal") );
			data.setGrade( rs.getString("grade") );
			data.setDeptno( rs.getString("deptno") );
			data.setDname( rs.getString("dname") );
			data.setLoc( rs.getString("loc") );
			
			datas.add( data );
		}
		
		if( rs != null ) rs.close();
		if( pstmt != null ) pstmt.close();
		if( conn != null ) conn.close();
		
		return datas;
	}
}

-EmpTO

package Pack1211;

public class EmpTO1 {
	private String empno;
	private String ename;
	private String job;
	private String sal;
	private String grade;
	private String deptno;
	private String dname;
	private String loc;
	
	public EmpTO1() {
	}

	//Setter and Getter
	public String getEmpno() {
		return empno;
	}

	public void setEmpno(String empno) {
		this.empno = empno;
	}

	public String getEname() {
		return ename;
	}

	public void setEname(String ename) {
		this.ename = ename;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	public String getSal() {
		return sal;
	}

	public void setSal(String sal) {
		this.sal = sal;
	}

	public String getGrade() {
		return grade;
	}

	public void setGrade(String grade) {
		this.grade = grade;
	}

	public String getDeptno() {
		return deptno;
	}

	public void setDeptno(String deptno) {
		this.deptno = deptno;
	}

	public String getDname() {
		return dname;
	}

	public void setDname(String dname) {
		this.dname = dname;
	}

	public String getLoc() {
		return loc;
	}

	public void setLoc(String loc) {
		this.loc = loc;
	}	
}

 

 

 

ㅇJDialog 사용하기

먼저 JFrame을 버튼하나 놓고 아래와 같이 만든다.

 

다시 아래와 같이 JDialog를 만든다.

만들고 디자인 화면을 보면 아래와 같다.

그리고 소스 코드를 보면 메인 메서드가 있는데 이를 주석처리하고 안에 내용만 복사해서

JFrame의 버튼 이벤트에 붙여넣는다.

그러면 프레임에서 버튼을 클릭하면 다이얼로그 창이 생성된다.

 

이제 윈도우 창 제어에 관해 알아보자.

프레임에서 다이얼로그 창이 만들어지면 윈도우 창의 제어권한이 자식인 다이얼로그한테 넘어가고

다이얼로그 창이 닫히면 윈도우 창의 제어권한이 부모인 프레임창으로 넘어온다.

 

즉, 다이얼로그 창이 만들어지면 부모창의 최소화, 닫기 버튼은 사용할 수 없다.

이를 확인하기 위해 프레임 클래스에 다음과 같이 코딩한다.

public JDialogEx1() {
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setBounds(100, 100, 580, 410);
	contentPane = new JPanel();
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
	setContentPane(contentPane);
	contentPane.setLayout(null);
	
	JButton btnNewButton = new JButton("New button");
	btnNewButton.addMouseListener(new MouseAdapter() {
		@Override
		public void mouseClicked(MouseEvent e) {
			JDialog_subEx1 dialog = new JDialog_subEx1();
			dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
			
			System.out.println( "다이얼로그 생성" );
			dialog.setModal(true);
			System.out.println( "부모 -> 자식 제어권한 위임" );
			
			//화면 제어를 자식창에게 위임, 부모창은 이제 제어할 수 없다.
			dialog.setVisible(true);
			
			//자식창을 닫으면 다시 부모창을 제어할 수 있다. 제어권한위임
			System.out.println( "자식 -> 부모 제어권한 위임" );
			
		}
	});
	btnNewButton.setBounds(12, 10, 97, 23);
	contentPane.add(btnNewButton);
}

실행해보면 아래와 같다.

 

ㅇ부모창과 자식창 간에 데이터 전달하기

-부모 JFrame에서 자식 JDialog로 데이터를 줄 때
	자식 Dialog 객체를 만들 때 생성자를 이용

-특정 시점에 부모 JFrame에서 자식 JDialog로 데이터를 줄 때
	자식 Dialog의 Setter 메소드 이용

-자식 JDialog를 닫을 때 부모 JFrame에게 데이터 전달
	자식 Dialog의 Setter 메소드 이용

아래 예제를 살펴보자.

 

-자식 JDialog 클래스

package Pack1213;

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class JDialog_subEx3 extends JDialog {
	
	private final JPanel contentPanel = new JPanel();
	//공유할 데이터 선언
	private String shareData;
	
	//부모로부터 초기데이터 받을 생성자 선언
	public JDialog_subEx3(String shareData) {
		this();
		this.shareData = shareData;
		
		System.out.println( "부모로부터 받은 초기 shareData : " + shareData );
	}
	
	//getter, setter, 완료된데이터보여줄 메서드 선언
	public String getShareData() {
		return shareData;
	}
	public void setShareData(String shareData) {
		this.shareData = shareData;
	}
	public void printShareData() {
		System.out.println( "부모로부터 받은 변경 shareData : " + this.shareData );
	}


	public JDialog_subEx3() {
		setBounds(100, 100, 450, 300);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setLayout(new FlowLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		{
			JPanel buttonPane = new JPanel();
			buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
			getContentPane().add(buttonPane, BorderLayout.SOUTH);
			{
				JButton okButton = new JButton("OK");
				okButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						JDialog_subEx3.this.setShareData( "30" );
						JDialog_subEx3.this.dispose();
					}
				});
				okButton.setActionCommand("OK");
				buttonPane.add(okButton);
				getRootPane().setDefaultButton(okButton);
			}
			{
				JButton cancelButton = new JButton("Cancel");
				cancelButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						JDialog_subEx3.this.dispose();
					}
				});
				cancelButton.setActionCommand("Cancel");
				buttonPane.add(cancelButton);
			}
		}
	}
}

-부모 JFrame 클래스

package Pack1213;

import java.awt.EventQueue;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class JDialogEx3 extends JFrame {

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					JDialogEx3 frame = new JDialogEx3();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public JDialogEx3() {
		setBounds(100, 100, 450, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setLayout(null);
		
		JButton btnNewButton = new JButton("New button");
		btnNewButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				JDialog_subEx3 dialog = new JDialog_subEx3( "10" );
				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
				
				System.out.println( "다이얼로그 생성" );
				dialog.setModal(true);
				System.out.println( "부모 -> 자식 제어권한 위임" );
				
				//Setter, Getter로 데이터 전달하고 변경하기
				dialog.setShareData( "20" );
				dialog.printShareData();
				
				//화면 제어를 자식창에게 위임, 부모창은 이제 제어할 수 없다.
				dialog.setVisible(true);
				
				//자식창을 닫으면 다시 부모창을 제어할 수 있다. 제어권한위임
				System.out.println( "자식 -> 부모 제어권한 위임" );
				System.out.println( "자식으로부터 받은 최종 shareData : " + dialog.getShareData() );
			}
		});
		btnNewButton.setBounds(12, 10, 97, 23);
		getContentPane().add(btnNewButton);

	}
}

-실행결과

OK를 누르면 아래와 같다.

CANCEL을 누르면 아래와 같다.

 

 

다이얼로그 사용시 주의할 점은

1. model을 이용해서 다이얼로그를 만들어야 한다.

2. 다이얼로그에서 main메서드를 실행하면 안된다.

3. 다이얼로그를 닫을 때 dispose() 메서드를 사용해야 한다.

4. 다이얼로그에서 데이터를 선언할 때 private으로 선언해야 한다.

 

ㅇColorChooser 사용하기

아래 코드를 실행하면 색상을 선택할 수 있는 다이얼로그가 나오고

특정 색상을 누르면 그 색상의 r, g, b 값을 출력해준다.

package Pack1213;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JColorChooser;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class JColorChooserEx1 extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					JColorChooserEx1 frame = new JColorChooserEx1();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public JColorChooserEx1() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JButton btnNewButton = new JButton("New button");
		btnNewButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				Color color = JColorChooser.showDialog(JColorChooserEx1.this, "파레트", Color.green);
				
				//컬러 선택됐을 때만 실행 / 컬러선택 하지않고 취소누르면 null이 된다.
				if ( color != null ) {
					System.out.println( color.getRed() );
					System.out.println( color.getGreen() );
					System.out.println( color.getBlue() );
				}
				System.out.println( color );
			}
		});
		btnNewButton.setBounds(12, 10, 97, 23);
		contentPane.add(btnNewButton);
	}
}

-실행결과

 

 

 

ㅇFileChooser 사용하기

아래와 같이 버튼을 만든다.

-특정 폴더에 모든 파일 보기

btnNewButton.addMouseListener(new MouseAdapter() {
	@Override
	public void mouseClicked(MouseEvent e) {
		JFileChooser fileChooser = new JFileChooser( "C:\\SelfStudyJava" );
		fileChooser.showOpenDialog(null);
	}
});

-특정 폴더에 특정 파일만 보기

btnNewButton_1.addMouseListener(new MouseAdapter() {
	@Override
	public void mouseClicked(MouseEvent e) {
		//자바 파일만 필터링하기
		JFileChooser fileChooser = new JFileChooser( "C:\\SelfStudyJava" );
		FileNameExtensionFilter filter = new FileNameExtensionFilter("java file", "java");
		fileChooser.addChoosableFileFilter(filter);
		fileChooser.showOpenDialog(null);
	}
});

파일타입 콤보박스를 열면 자바 파일이 보인다.

-파일 저장하기

JButton btnNewButton_2 = new JButton("New button");
btnNewButton_2.addMouseListener(new MouseAdapter() {
	@Override
	public void mouseClicked(MouseEvent e) {
		//파일 저장하기
		JFileChooser fileChooser = new JFileChooser();
		fileChooser.showSaveDialog(null);
	}
});

 

실습) java파일중 하나를 가져와서 TextArea에 띄우고 그 내용을 다른 폴더에 다시 저장하기

디자인은 아래와 같다.

-실행코드

package Pack1213;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.HeadlessException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class JFileChooserEx2 extends JFrame {

	private JPanel contentPane;
	private JTextArea textArea;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					JFileChooserEx2 frame = new JFileChooserEx2();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public JFileChooserEx2() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 636, 504);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JButton btnNewButton = new JButton("\uC790\uBC14 \uD30C\uC77C \uC5F4\uAE30");
		btnNewButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				//textArea 초기화
				textArea.setText( "" );
				
				//파일 선택하기
				JFileChooser fileChooser = new JFileChooser( "C:\\SelfStudyJava" );
				FileNameExtensionFilter filter = new FileNameExtensionFilter("Java File", "java");
				fileChooser.setFileFilter(filter);
				int result = fileChooser.showOpenDialog( JFileChooserEx2.this );
				
				if ( result == JFileChooser.APPROVE_OPTION ) {
					try {
						//선택된 파일 버퍼에 넣기
						BufferedReader br = new BufferedReader( new FileReader( fileChooser.getSelectedFile() ) );
						
						//선택된 파일 읽어서 textArea에 한 줄씩 추가
						String data = null;
						while ( ( data = br.readLine() ) != null ) {
							textArea.append( data + "\n");
						}
						br.close();
						
					} catch (FileNotFoundException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				} else if ( result == JFileChooser.CANCEL_OPTION ) {
					System.out.println( "취소" );
				}
			}
		});
		btnNewButton.setBounds(12, 32, 167, 23);
		contentPane.add(btnNewButton);
		
		JButton btnNewButton_1 = new JButton("\uC790\uBC14 \uD30C\uC77C \uC800\uC7A5");
		btnNewButton_1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				//textArea파일 저장하기
				if ( textArea.getText() != null ) {
					JFileChooser fileChooser = new JFileChooser();
					int result = fileChooser.showSaveDialog( JFileChooserEx2.this );
					
					if ( result == JFileChooser.APPROVE_OPTION ) {
						try {
							BufferedWriter bw = new BufferedWriter( new FileWriter( fileChooser.getSelectedFile() ) );
							bw.write( textArea.getText() );
							bw.flush();
							bw.close();
							
						} catch (IOException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					} else if ( result == JFileChooser.CANCEL_OPTION ) {
						System.out.println( "취소" );
					}
				} 
			}
		});
		btnNewButton_1.setBounds(191, 32, 167, 23);
		contentPane.add(btnNewButton_1);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 81, 596, 374);
		contentPane.add(scrollPane);
		
		textArea = new JTextArea();
		scrollPane.setViewportView(textArea);
		textArea.setEditable(false);
	}
}

-결과

 

ㅇ JMeun 사용하기

디자인 탭에서 먼저 JMeunBar를 만들고 JMeun를 넣은 다음에 그 안에 JMeunItem을 넣으면 된다.

이벤트를 주는 방법은 아래와 같다.

 

 

ㅇ 복습 및 배울 내용

Swing
1. Container
2. LayoutManager
	Null
	*기본 레이아웃
		setLayout(레이아웃 클래스명)
		JFrame / JDialog 	- BorderLayout
		JPanel		- FlowLayout

3. Widget
4. Event

 

 

ㅇ 각종 Layout 사용하기

-Border Layout

자동적으로 자리를 잡아주는 레이아웃

버튼을 각 자리에 넣어보자.

 

 

이번에는 패널을 각 자리에 집어넣어보자.

패널 안에 버튼을 넣어보자..

 

-Flow Layout

물 흐르듯이 바로 옆에 컴포넌트나 컨테이너들이 생긴다.

 

-CardLayout

하나의 패널을 만들고 카드 레이아웃으로 바꿔보자.

이제 패널 안에 또 다른 패널을 넣어보자.

이제 소스코드로 가서 아래와 같이 각 패널에 배경색을 넣어준다.

package Pack1211;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.CardLayout;
import java.awt.Color;

public class LayoutEx2 extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					LayoutEx2 frame = new LayoutEx2();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
	public LayoutEx2() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 567, 467);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panel = new JPanel();
		
		panel.setBounds(12, 10, 298, 174);
		contentPane.add(panel);
		panel.setBackground( Color.black );
		panel.setLayout(new CardLayout(0, 0));
		
		JPanel panel_1 = new JPanel();
		panel_1.setBackground( Color.CYAN);
		panel.add(panel_1, "name_8943103989600");
		
		JPanel panel_2 = new JPanel();
		panel_2.setBackground( Color.red);
		panel.add(panel_2, "name_8992691226200");
		
		JPanel panel_3 = new JPanel();
		panel_3.setBackground( Color.blue);
		panel.add(panel_3, "name_8999146350000");
	}
}

이제 동그라미친 화살표를 누르면 각 패널의 색깔이 바뀌어있다.

이제 버튼을 넣고 각 버튼을 누를때마다 해당 패널이 보이도록 만들어보자.

아래와 같이 코딩한다.

package Pack1211;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.CardLayout;
import java.awt.Color;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class LayoutEx2 extends JFrame {

	private JPanel contentPane;
	private JPanel panel_1;
	private JPanel panel_2;
	private JPanel panel_3;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					LayoutEx2 frame = new LayoutEx2();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public LayoutEx2() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 567, 467);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panel = new JPanel();
		
		panel.setBounds(12, 10, 298, 174);
		contentPane.add(panel);
		panel.setBackground( Color.black );
		panel.setLayout(new CardLayout(0, 0));
		
		panel_1 = new JPanel();
		panel_1.setBackground( Color.CYAN);
		panel.add(panel_1, "name_8943103989600");
		
		panel_2 = new JPanel();
		panel_2.setBackground( Color.red);
		panel.add(panel_2, "name_8992691226200");
		
		panel_3 = new JPanel();
		panel_3.setBackground( Color.blue);
		panel.add(panel_3, "name_8999146350000");
		
		JButton btnNewButton = new JButton("New button");
		btnNewButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				((CardLayout)panel.getLayout()).show(panel, "name_8943103989600");
			}
		});
		btnNewButton.setBounds(401, 10, 97, 23);
		contentPane.add(btnNewButton);
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
		JButton btnNewButton_1 = new JButton("New button");
		btnNewButton_1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				((CardLayout)panel.getLayout()).show(panel, "name_8992691226200");
			}
		});
		btnNewButton_1.setBounds(401, 43, 97, 23);
		contentPane.add(btnNewButton_1);
		
		JButton btnNewButton_2 = new JButton("New button");
		btnNewButton_2.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				((CardLayout)panel.getLayout()).show(panel, "name_8999146350000");
			}
		});
		btnNewButton_2.setBounds(401, 76, 97, 23);
		contentPane.add(btnNewButton_2);
	}
}

 

각 패널 레이아웃을 앱솔루트로 바꿔주고 그 안에 버튼을 넣어보자.

 

-GridLayout

하나의 JFrame을 만든다음 레이아웃을 그리드 레이아웃을 설정하고

columns는 열의 개수, rows는 행의 개수

hgap은 가로 갭, vgap은 세로 갭을 의미한다.

 

 

ㅇ Event 사용하기

Event
	Listner
	Adapter
	*리스너와 어댑터는 이벤트가 만들어지는 것을 감시한다.

발생시점별로 이벤트 나누기
	아래 이벤트들은 이벤트 클래스 안에 모두 메서드화 되어있다.
1. Window event - JFrame이나 JDialog에 열기, 닫기, 비활성화, 최소화 등에 관한 것
2. Action event - 마우스클릭, 키보드 엔터, 아이템선택 등
3. Mouse event - 클릭, 오버, 영역내에 들어가거나 영역밖으로 빠질때 등등
4. Keyboard event - 키보드가 눌릴 때

이벤트 전용 인터페이스를 이용해서 이벤트 만들어보자.

 

-Window Event

JFrame 하나 만들고 아래와 같이 코딩한다.

package Pack1211;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class EventEx1 extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					EventEx1 frame = new EventEx1();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
     ㅡㅡ여기서부터ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
	public EventEx1() {
		//자동으로 닫히는 부분 지우기
		//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//윈도우 이벤트를 읽는 것
		//add 이벤트종류 Listner() -> 이벤트종류Listner를 inner class 생성 -> 이 안에 해당되는 메서드들이 있다.
		this.addWindowListener( new WindowListener() {
			
			@Override
			public void windowOpened(WindowEvent e) {
				// TODO Auto-generated method stub
				System.out.println( "windowOpened(WindowEvent e)" );
			}
			
			@Override
			public void windowIconified(WindowEvent e) {
				// TODO Auto-generated method stub
				System.out.println( "windowIconified" );
			}
			
			@Override
			public void windowDeiconified(WindowEvent e) {
				// TODO Auto-generated method stub
				System.out.println("windowDeiconified(WindowEvent e)");
			}
			
			@Override
			public void windowDeactivated(WindowEvent e) {
				// TODO Auto-generated method stub
				System.out.println("windowDeactivated(WindowEvent e)");
			}
			
			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				System.out.println("windowClosing(WindowEvent e)");
			}
			
			@Override
			public void windowClosed(WindowEvent e) {
				// TODO Auto-generated method stub
				System.out.println("windowClosed(WindowEvent e)");
			}
			
			@Override
			public void windowActivated(WindowEvent e) {
				// TODO Auto-generated method stub
				System.out.println("windowActivated(WindowEvent e)");
			}
		} );	
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
	}

}

실행해보면 윈도우 창에 마우스를 가져다대거나 최소화하거나 위젯화하면 해당 메소드가 출려된다.

 

 

-Mouse Event 사용

이번에는 마우스 이벤트를 직접 코딩해서 사용해보자.

코드는 아래와 같다.

alt + shift + s 를 누르고 v를 누르면 저절로 오버라이드된다.

package Pack1211;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

public class EventEx2 extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					EventEx2 frame = new EventEx2();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ여기부터ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
	public EventEx2() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JButton btnNewButton = new JButton("New button");
		
		//마우스 이벤트 설정하기
		btnNewButton.addMouseListener( new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub
				System.out.println( "mouseReleased" );
			}
			
			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				System.out.println( "mousePressed" );
			}
			
			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				System.out.println( "mouseExited" );
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				System.out.println( "mouseEntered" );
			}
			
			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				System.out.println( "mouseClicked" );
			}
		});
		btnNewButton.setBounds(12, 10, 97, 23);
		contentPane.add(btnNewButton);
		
		JButton btnNewButton_1 = new JButton("New button");
		// addMouseListner -> MouseListner ( 전체구현 )
		//					-> MouseAdater ( 특정 메서드만 구현 )
		btnNewButton_1.addMouseListener( new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				System.out.println( "mouseClicked" );
			}
		});
		
		btnNewButton_1.setBounds(12, 54, 97, 23);
		contentPane.add(btnNewButton_1);
	}

}

 

버튼에 마우스를 올려놓거나 클릭하거나 클릭이끝나면 메소드가 출력된다.

 

만약 특정 메소드만 구현하고 싶으면 아래 처럼 사용한다.

두번째 버튼은 클릭할때만 메소드가 출력되도록 해본다.

		JButton btnNewButton_1 = new JButton("New button");
		// addMouseListner -> MouseListner ( 전체구현 )
		//					-> MouseAdater ( 특정 메서드만 구현 )
		btnNewButton_1.addMouseListener( new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				System.out.println( "mouseClicked" );
			}
		});

 

이번에는 현재 inner클래스로 마우스리스너 인터페이스를 구현하기에는 코드가 복잡해진다.

따라서 UI 클래스가 마우스리스너 인터페이스를 구현하고 메소드를 재정의하면 코드가 짧아질 수 있다.

package Pack1211;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ여기서 구현받는다.
public class EventEx3 extends JFrame implements MouseListener {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					EventEx3 frame = new EventEx3();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ코딩내용
	public EventEx3() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JButton btn1 = new JButton("New button");
		btn1.setBounds(22, 10, 97, 23);
		//현재UI클래스에 마우스리스너 인터페이스를 구현하고 있으니깐 this를 쓰면 된다.
		btn1.addMouseListener( this );
		contentPane.add(btn1);
		
		JButton btn2 = new JButton("New button");
		btn2.setBounds(22, 56, 97, 23);
		
		btn2.addMouseListener( this );
		contentPane.add(btn2);
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println( "마우스 클릭" );
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
}

 

어떤 버튼이 클릭됐는지 알 수가 있도록 만들어보자.

버튼의 좌표값와 소스값을 얻어올 수 있다.

 

 

이번에는 내부클래스를 만들고 마우스리스너 인터페이스를 구현해보자.

package Pack1211;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

public class EventEx3 extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					EventEx3 frame = new EventEx3();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public EventEx3() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JButton btn1 = new JButton("\uBC84\uD2BC1");
		btn1.setBounds(22, 10, 97, 23);
		//btn1.addMouseListener( this );
		btn1.addMouseListener( new UserMouseEvent() );
		contentPane.add(btn1);
		
		JButton btn2 = new JButton("\uBC84\uD2BC2");
		btn2.setBounds(22, 56, 97, 23);
		//btn2.addMouseListener( this );
		btn2.addMouseListener( new UserMouseEvent() );
		contentPane.add(btn2);
	}
여기부터ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
	//내부 인스턴스 또는 스태틱 클래스 만들기
	class UserMouseEvent implements MouseListener {

		@Override
		public void mouseClicked(MouseEvent e) {
			// TODO Auto-generated method stub
			System.out.println( "마우스 클릭" );
		}

		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
	}
}

 

이번에는 외부클래스로 만들고 가져와서 사용해보자.

-UserMouseEvent 클래스

package Pack1211;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class UserMouseEvent implements MouseListener {

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println( "마우스 클릭" );
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
}

-UI 및 실행클래스

	public EventEx3() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JButton btn1 = new JButton("\uBC84\uD2BC1");
		btn1.setBounds(22, 10, 97, 23);
		//btn1.addMouseListener( this );
		btn1.addMouseListener( new UserMouseEvent() );
		contentPane.add(btn1);
		
		JButton btn2 = new JButton("\uBC84\uD2BC2");
		btn2.setBounds(22, 56, 97, 23);
		//btn2.addMouseListener( this );
		btn2.addMouseListener( new UserMouseEvent() );
		contentPane.add(btn2);
	}

 

 

ㅇ우편번호 검색기 또 만들기;

아래 그림처럼 만들어보자.

-UI 클래스

package Pack1211;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JComboBox;
import javax.swing.border.TitledBorder;

import Pack1.ZipcodeTO;

import javax.swing.border.EtchedBorder;
import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;


public class ZipcodeSearchEx extends JFrame {
	
	private JPanel contentPane;
	private JTextField textField;
	private String mainSido;
	private String mainGugun;
	private String mainDong;
	private JList list;
	

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					ZipcodeSearchEx frame = new ZipcodeSearchEx();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public ZipcodeSearchEx() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 640, 527);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, new Color(255, 255, 255), new Color(160, 160, 160)), "\uC6B0\uD3B8\uBC88\uD638 \uAC80\uC0C9\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
		panel.setBounds(12, 10, 600, 153);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JComboBox comboBox_2 = new JComboBox();
		comboBox_2.setBounds(394, 46, 179, 23);
		panel.add(comboBox_2);
		
		
		JComboBox comboBox_1 = new JComboBox();
		
		comboBox_1.setBounds(203, 46, 179, 23);
		panel.add(comboBox_1);
		
		
		JComboBox comboBox = new JComboBox();
		try {
			comboBox.setModel( new ZipcodeSidoComboModelEx() );
			
			comboBox.addItemListener(new ItemListener() {
				public void itemStateChanged(ItemEvent e) {
					mainSido = (String)comboBox.getSelectedItem();
					try {
						//시도 콤보박스에 값이 정해지면 구군 콤보박스의 내용 만들기
						comboBox_1.setModel( new ZipcodeGugunComboModelEx( mainSido ) );
					} catch (ClassNotFoundException | SQLException e2) {
						// TODO Auto-generated catch block
						e2.printStackTrace();
					}
					
					comboBox_1.addItemListener( new ItemListener() {
						public void itemStateChanged(ItemEvent e) {
							mainGugun = (String)comboBox_1.getSelectedItem();
							try {
								//구군 콤보박스가 선택되면 동 콤보박스 내용 만들기
								comboBox_2.setModel( new ZipcodeDongComboModelEx( mainSido, mainGugun ) );
							
							} catch (ClassNotFoundException | SQLException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
							
							comboBox_2.addItemListener( new ItemListener() {
								public void itemStateChanged(ItemEvent e) {
									mainDong = (String)comboBox_2.getSelectedItem();		
								}
							});
						}
					});
					
				}
			});
			
		} catch (ClassNotFoundException | SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		comboBox.setBounds(12, 46, 179, 23);
		panel.add(comboBox);
		
		JLabel lblNewLabel = new JLabel("\uC2DC");
		lblNewLabel.setBounds(12, 22, 57, 15);
		panel.add(lblNewLabel);
		
		JLabel lblNewLabel_1 = new JLabel("\uAD6C / \uAD70");
		lblNewLabel_1.setBounds(203, 22, 57, 15);
		panel.add(lblNewLabel_1);
		
		JLabel lblNewLabel_2 = new JLabel("\uB3D9");
		lblNewLabel_2.setBounds(394, 22, 57, 15);
		panel.add(lblNewLabel_2);
		
		textField = new JTextField();
		textField.setEditable(false);
		textField.setBounds(12, 107, 439, 21);
		panel.add(textField);
		textField.setColumns(10);
		
		JLabel lblNewLabel_3 = new JLabel("\uC120\uD0DD\uB41C \uC8FC\uC18C");
		lblNewLabel_3.setBounds(12, 82, 106, 15);
		panel.add(lblNewLabel_3);
		
		JButton btnNewButton = new JButton("\uAC80\uC0C9");
		btnNewButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				try {
                //list 만들기
					list.setModel( new ZipcodeJListModelEx(mainSido, mainGugun, mainDong));
					
				} catch (ClassNotFoundException | SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		btnNewButton.setBounds(476, 106, 97, 23);
		panel.add(btnNewButton);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 166, 600, 312);
		contentPane.add(scrollPane);
		
		list = new JList();
		list.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
            //list 주소 목록중에 하나 클릭하면 텍스트필드에 해당 주소값 나옴
				textField.setText( (String)list.getSelectedValue() );
			}
		});
		scrollPane.setViewportView(list);
	}
}

-시도 콤보박스 만드는 모델

package Pack1211;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.DefaultComboBoxModel;

public class ZipcodeSidoComboModelEx extends DefaultComboBoxModel<Object> {
	private ArrayList<ZipcodeJListTO> datas = new ArrayList<ZipcodeJListTO>();

	public ZipcodeSidoComboModelEx() throws ClassNotFoundException, SQLException {
		ZipcodeJListDAO dao = new ZipcodeJListDAO();
		datas = dao.searchSido();
	}

	@Override
	public int getSize() {
		return datas.size();
	}

	@Override
	public Object getElementAt(int index) {
		return datas.get(index).getSido();
		
	}
}

-구군 콤보박스 만드는 모델

package Pack1211;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.DefaultComboBoxModel;

public class ZipcodeGugunComboModelEx extends DefaultComboBoxModel<Object> {
	ArrayList<ZipcodeJListTO> datas = new ArrayList<ZipcodeJListTO>();

	public ZipcodeGugunComboModelEx( String sido ) throws ClassNotFoundException, SQLException {
		ZipcodeJListDAO dao = new ZipcodeJListDAO();
		
		datas = dao.searchGugun( sido );
	}

	@Override
	public int getSize() {
		return datas.size();
	}

	@Override
	public Object getElementAt(int index) {
		return datas.get(index).getGugun();
	}
}

-동 콤보박스 만드는 모델

package Pack1211;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.DefaultComboBoxModel;

public class ZipcodeDongComboModelEx extends DefaultComboBoxModel<Object> {
	ArrayList<ZipcodeJListTO> datas = new ArrayList<ZipcodeJListTO>();

	public ZipcodeDongComboModelEx(String sido, String gugun) throws ClassNotFoundException, SQLException {
		ZipcodeJListDAO dao = new ZipcodeJListDAO();
		datas = dao.searchDong( sido, gugun);
	}

	@Override
	public int getSize() {
		return datas.size();
	}

	@Override
	public Object getElementAt(int index) {
		return datas.get(index).getDong();
	}
}

-DB로부터 데이터 가져와서 리스트와 콤보박스에 데이터주는 DAO 클래스

package Pack1211;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class ZipcodeJListDAO {
	private ArrayList<ZipcodeJListTO> datas = new ArrayList<ZipcodeJListTO>();
	private ArrayList<ZipcodeJListTO> sidos = new ArrayList<ZipcodeJListTO>();
	private ArrayList<ZipcodeJListTO> guguns = new ArrayList<ZipcodeJListTO>();
	private ArrayList<ZipcodeJListTO> dongs = new ArrayList<ZipcodeJListTO>();

	private Connection conn = null;
	private boolean add;
	
	//시도만 가져오는 메서드
	public ArrayList<ZipcodeJListTO> searchSido() throws SQLException, ClassNotFoundException {
		//db 연결 정보
		String url = "jdbc:mysql://localhost:3307/sample";
		String user = "root";
		String password = "!123456";
				
		//db 드라이버 로딩
		Class.forName( "org.mariadb.jdbc.Driver" );
		this.conn = DriverManager.getConnection(url, user, password);
		
		String sqlSido = 
		"select distinct sido from zipcode union select distinct substr(gugun, 1, 2) from zipcode where substr(gugun, 1, 3) like '%시'";
		Statement stmtSido = this.conn.createStatement();
		ResultSet rsSido = stmtSido.executeQuery(sqlSido);
		while( rsSido.next() ) {
			ZipcodeJListTO data = new ZipcodeJListTO();
			data.setSido( rsSido.getString( 1 ) );
			sidos.add( data );
		}
		return sidos;
	}

	//구군만 가져오는 메서드
	public ArrayList<ZipcodeJListTO> searchGugun( String sido ) throws SQLException, ClassNotFoundException {
		//db 연결 정보
		String url = "jdbc:mysql://localhost:3307/sample";
		String user = "root";
		String password = "!123456";
				
		//db 드라이버 로딩
		Class.forName( "org.mariadb.jdbc.Driver" );
		this.conn = DriverManager.getConnection(url, user, password);
		
		String sqlGugun = 
		"select distinct gugun from zipcode where sido like ? union select distinct substr(gugun, 5, 7) from zipcode where gugun like ?";
		PreparedStatement pstmtGugun = this.conn.prepareStatement(sqlGugun);
		pstmtGugun.setString(1, sido);
		pstmtGugun.setString(2, sido + "%");
		ResultSet rsGugun = pstmtGugun.executeQuery();
		while( rsGugun.next() ) {
			ZipcodeJListTO data = new ZipcodeJListTO();
			data.setGugun( rsGugun.getString( "gugun" ) );
			guguns.add( data );
		}
		return guguns;
	}
	
	//동만 가져오는 메서드
	public ArrayList<ZipcodeJListTO> searchDong( String sido, String gugun ) throws SQLException, ClassNotFoundException {
		//db 연결 정보
		String url = "jdbc:mysql://localhost:3307/sample";
		String user = "root";
		String password = "!123456";
				
		//db 드라이버 로딩
		Class.forName( "org.mariadb.jdbc.Driver" );
		this.conn = DriverManager.getConnection(url, user, password);
		
		String sqlDong = "select distinct dong from zipcode where ( sido like ? or substr(gugun, 1, 2) like ? ) and ( gugun like ? or substr(gugun, 5, 7) like ?) ";
		PreparedStatement pstmtDong = this.conn.prepareStatement(sqlDong);
		pstmtDong.setString(1, sido);
		pstmtDong.setString(2, sido + "%");
		pstmtDong.setString(3, gugun);
		pstmtDong.setString(4, gugun + "%");

		ResultSet rsDong = pstmtDong.executeQuery();
		while( rsDong.next() ) {
			ZipcodeJListTO data = new ZipcodeJListTO();
			data.setDong(rsDong.getString( "dong" ));
			dongs.add( data );
		}
		return dongs;
	}

	//조건에 맞는 것만 가져오는 최종메서드
	public ArrayList<ZipcodeJListTO> searchZipcode( String strSido, String strGugun, String strDong ) 
			throws ClassNotFoundException, SQLException {
		//db 연결 정보
		String url = "jdbc:mysql://localhost:3307/sample";
		String user = "root";
		String password = "!123456";
		
		//db 드라이버 로딩
		Class.forName( "org.mariadb.jdbc.Driver" );
		this.conn = DriverManager.getConnection(url, user, password);
		
		//조건에 맞는 sql문
		String sql = 
		"select zipcode, sido, gugun, dong, ri, bunji from zipcode where (sido like ? or substr(gugun,1,2) like ?) and (dong like ?)";
		PreparedStatement pstmt = this.conn.prepareStatement(sql);
		pstmt.setString(1, strSido);
		pstmt.setString(2, strSido + "%");
		pstmt.setString(3, strDong);
		ResultSet rs = pstmt.executeQuery();
		while( rs.next() ) {
			String zipcode = rs.getString( "zipcode" );
			String sido = rs.getString( "sido" );
			String gugun = rs.getString( "gugun" );
			String dong = rs.getString( "dong" );
			String ri = rs.getString( "ri" );
			String bunji = rs.getString( "bunji" );
			ZipcodeJListTO data = new ZipcodeJListTO( zipcode, sido, gugun, dong, ri, bunji );
			datas.add( data );
		}
		if( rs != null ) rs.close();
		if( pstmt != null ) pstmt.close();
		if( conn != null ) conn.close();
		
		return datas;
	}
}

-DAO가 DB로부터 데이터 가져올 때 사용하는 TO

package Pack1211;

public class ZipcodeJListTO {
	private String zipcode;
	private String sido;
	private String gugun;
	private String dong;
	private String ri;
	private String bunji;
	
	
	public ZipcodeJListTO(String zipcode, String sido, String gugun, String dong, String ri, String bunji) {
		this.zipcode = zipcode;
		this.sido = sido;
		this.gugun = gugun;
		this.dong = dong;
		this.ri = ri;
		this.bunji = bunji;
	}
	public ZipcodeJListTO() {
	}

	
	
	public void setSido(String sido) {
		this.sido = sido;
	}
	public void setGugun(String gugun) {
		this.gugun = gugun;
	}
	public void setDong(String dong) {
		this.dong = dong;
	}
	
	
	
	public String getZipcode() {
		return zipcode;
	}

	public String getSido() {
		return sido;
	}

	public String getGugun() {
		return gugun;
	}

	public String getDong() {
		return dong;
	}

	public String getRi() {
		return ri;
	}

	public String getBunji() {
		return bunji;
	}
}

 

-실행결과
특정 시도를 선택하면 거기에 속한 구군만 나온다.

또한 특정 시도, 구군을 선택하면 거기에 속한 동만 나온다.

 

728x90
반응형
Comments