지구정복

[JAVA] 12/09 | 우편번호검색기(객체지향적 코딩, DAO/TO), UML, JCheckBox, JRadioButton, JOptionPane, JProgressBar, JSlider(색상혼합기 만들기) 본문

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

[JAVA] 12/09 | 우편번호검색기(객체지향적 코딩, DAO/TO), UML, JCheckBox, JRadioButton, JOptionPane, JProgressBar, JSlider(색상혼합기 만들기)

eeaarrtthh 2020. 12. 9. 15:22
728x90
반응형

복습

UI
	CUI
	GUI
		사용자와 인터페이스(2D Graphic)
		Widget
			Contatiner	- Contatiner, Component
				JFrame : 프로그램당 1개
				JDialogue : JFrame의 자식창
				JPanel : Component 그룹
			Component
				JLable
				JButton
				JTextField / JPassword / JTextArea

		LayoutManager
			Absolute LayoutManager (Null Layout Manager) : 좌표중심
			나머지 레이아웃도 많음
		Event
			Event 중심의 프로그램 방식
			마우스 클릭 이벤트 선언 방법을 암기
				=> 익명 인너클래스 구조

GUI 프로그램 만들 때의 순서
-Design : 디자인을 하는 툴 : Window Builder
1. Container 정하기
2. LayoutManager 정하기
3. Component 넣기
4. Event 넣기

-Coding : 코딩하는 툴 : eclispse 또는 별도 프로그램
	Event 내용

 

주소검색기 프로그램 강사님 코드

1. 디자인

JPanel(Border) 타이틀 바꾸는 법

아래와 같이 디자인을 한다.

2. 이벤트 코딩

먼저 코드를 백업해보자.

현재 클래스를 복사해서 동일 디렉터리에 붙여넣기를 하고 열때는 윈도우빌더로 열어야한다.

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.JTextField;
import javax.swing.JButton;
import javax.swing.border.TitledBorder;
import javax.swing.border.EtchedBorder;
import java.awt.Color;
import javax.swing.JTextArea;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JScrollPane;

public class ZipcodeSearchUI01 extends JFrame {

	private JPanel contentPane;
	private JTextField textField;
	private JTextArea textArea;

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

	/**
	 * Create the frame.
	 */
	public ZipcodeSearchUI01() {
		setTitle("\uC6B0\uD3B8\uBC88\uD638 \uAC80\uC0C9\uAE30");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 628, 435);
		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", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
		panel.setBounds(6, 10, 600, 55);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("\uB3D9 \uC774\uB984 \uC785\uB825");
		lblNewLabel.setBounds(12, 21, 78, 15);
		panel.add(lblNewLabel);
		
		textField = new JTextField();
		textField.setBounds(96, 18, 371, 21);
		panel.add(textField);
		textField.setColumns(10);
		
        ////////이벤트 코딩
		JButton btn1 = new JButton("\uAC80\uC0C9\uD558\uAE30");
		btn1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
            			textArea.setText( "" );
				String strDong = textField.getText();
				
				//데이터베이스 관련 인스턴스 선언
				String url = "jdbc:mysql://localhost:3307/sample";
				String user = "root";
				String password = "!123456";
				
				Connection conn = null;
				PreparedStatement pstmt = null;
				ResultSet rs = null;
				
				try {
					Class.forName( "org.mariadb.jdbc.Driver" );
					conn = DriverManager.getConnection(url, user, password);
					
					String sql = "select zipcode, sido, gugun, dong, ri, bunji from zipcode where dong like ?";
					pstmt = conn.prepareStatement(sql);
					pstmt.setString(1, strDong + "%");
					
					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" );
						String arrdress = String.format("[%s] %s %s %s %s %s\n",
								zipcode, sido, gugun, dong, ri, bunji);
						textArea.append( arrdress );
					}
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					System.out.println( "error : " + e1.getMessage() );
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					System.out.println( "error : " + e1.getMessage() );
				} finally {
					if(conn != null) try {conn.close();} catch(SQLException e1) {}
					if(pstmt != null) try {pstmt.close();} catch(SQLException e1) {}
					if(rs != null) try {rs.close();} catch(SQLException e1) {}
				}
				
			}
		});
		btn1.setBounds(491, 17, 97, 23);
		panel.add(btn1);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 68, 588, 318);
		contentPane.add(scrollPane);
		
		textArea = new JTextArea();
		scrollPane.setViewportView(textArea);
		textArea.setEditable(false);
	}
}

3. 결과

 

이번에는 객체지향적으로 만들어보자.

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.JTextField;
import javax.swing.JButton;
import javax.swing.border.TitledBorder;
import javax.swing.border.EtchedBorder;
import java.awt.Color;
import javax.swing.JTextArea;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
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 ZipcodeSearchUI2 extends JFrame {

	private JPanel contentPane;
	private JTextField textField;
	private JTextArea textArea;

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

	/**
	 * Create the frame.
	 */
	public ZipcodeSearchUI2 () {
		setTitle("\uC6B0\uD3B8\uBC88\uD638 \uAC80\uC0C9\uAE30");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 628, 435);
		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", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
		panel.setBounds(6, 10, 600, 55);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("\uB3D9 \uC774\uB984 \uC785\uB825");
		lblNewLabel.setBounds(12, 21, 78, 15);
		panel.add(lblNewLabel);
		
		textField = new JTextField();
		textField.setBounds(96, 18, 371, 21);
		panel.add(textField);
		textField.setColumns(10);
		
		
		/////이벤트 코딩
		JButton btn1 = new JButton("\uAC80\uC0C9\uD558\uAE30");
		btn1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				textArea.setText( "" );
				
				String strDong = textField.getText();
				//이벤트 메소드 호출
				ArrayList<String> addresses = searchZipcode( strDong );
				for (String address : addresses ) {
					textArea.append( address );
				}
			}
		});
		btn1.setBounds(491, 17, 97, 23);
		panel.add(btn1);
		
		textArea = new JTextArea();
		textArea.setEditable(false);
		textArea.setBounds(12, 68, 588, 318);
		contentPane.add(textArea);
	}
	
	//////이벤트 메소드 선언
	private ArrayList<String> searchZipcode( String strDong) {
		//데이터베이스 관련 인스턴스 선언
		String url = "jdbc:mysql://localhost:3307/sample";
		String user = "root";
		String password = "!123456";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		ArrayList<String> result = new ArrayList<String>();
		
		try {
			Class.forName( "org.mariadb.jdbc.Driver" );
			conn = DriverManager.getConnection(url, user, password);
			
			String sql = "select zipcode, sido, gugun, dong, ri, bunji from zipcode where dong like ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, strDong + "%");
			
			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" );
				String address = String.format("[%s] %s %s %s %s %s\n",
						zipcode, sido, gugun, dong, ri, bunji);
				result.add( address );
			}
		} catch (ClassNotFoundException e1) {
			// TODO Auto-generated catch block
			System.out.println( "error : " + e1.getMessage() );
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			System.out.println( "error : " + e1.getMessage() );
		} finally {
			if(conn != null) try {conn.close();} catch(SQLException e1) {}
			if(pstmt != null) try {pstmt.close();} catch(SQLException e1) {}
			if(rs != null) try {rs.close();} catch(SQLException e1) {}
		}
		
		return result;
	}
}

 

이번에는 DAO/TO형태로 클래스화해보자. 아래의 클래스명을 사용한다.

ZipcodeTo

ZipcodeDAO

    생성자

    public ArrayList<ZipcodeTO> SearchZipcode(String strDong) 메소드

 

ZipcodeTo 클래스

public class ZipcodeTO {
	private String zipcode;
	private String sido;
	private String gugun;
	private String dong;
	private String ri;
	private String bunji;
	
	public ZipcodeTO(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 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;
	}
}

ZipcodeDAO 클래스

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 ZipcodeDAO {
	private Connection conn = null;

	//생성자 겸 데이터베이스 연결
	public ZipcodeDAO() 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);
	}
	
	//집코드 검색하는 메소드
	public ArrayList<ZipcodeTO> searchZipcode(String strDong) throws SQLException {
		ArrayList<ZipcodeTO> datas = new ArrayList<ZipcodeTO>();
		
		String sql = "select zipcode, sido, gugun, dong, ri, bunji from zipcode where dong like ?";
		PreparedStatement pstmt = this.conn.prepareStatement(sql);
		pstmt.setString(1, 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" );
			ZipcodeTO to = new ZipcodeTO( zipcode, sido, gugun, dong, ri, bunji );
			datas.add( to );
		}
		
		if( rs != null ) rs.close();
		if( pstmt != null ) pstmt.close();
		if( conn != null ) conn.close();
		
		return datas;
	}
}

실행클래스

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.JTextField;
import javax.swing.JButton;
import javax.swing.border.TitledBorder;
import javax.swing.border.EtchedBorder;
import java.awt.Color;
import javax.swing.JTextArea;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
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 ZipcodeSearchUI3 extends JFrame {

	private JPanel contentPane;
	private JTextField textField;
	private JTextArea textArea;

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

	/**
	 * Create the frame.
	 */
	public ZipcodeSearchUI3 () {
		setTitle("\uC6B0\uD3B8\uBC88\uD638 \uAC80\uC0C9\uAE30");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 628, 435);
		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", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
		panel.setBounds(6, 10, 600, 55);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("\uB3D9 \uC774\uB984 \uC785\uB825");
		lblNewLabel.setBounds(12, 21, 78, 15);
		panel.add(lblNewLabel);
		
		textField = new JTextField();
		textField.setBounds(96, 18, 371, 21);
		panel.add(textField);
		textField.setColumns(10);
        
        /////이벤트 코딩
		JButton btn1 = new JButton("\uAC80\uC0C9\uD558\uAE30");
		btn1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				textArea.setText( "" );
				String strDong = textField.getText();
				
				try {
					ZipcodeDAO dao = new ZipcodeDAO();
					ArrayList<ZipcodeTO> datas = dao.searchZipcode( strDong );
					
					textArea.setText( "" );
					for( ZipcodeTO to : datas ) {
						String strAddress = String.format("[%s] %s %s %s %s %s\n",
								to.getZipcode(), to.getSido(), to.getGugun(), to.getDong(), to.getRi(), to.getBunji());
						textArea.append( strAddress);
					}
					
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				
			}
		});
		btn1.setBounds(491, 17, 97, 23);
		panel.add(btn1);
		
		textArea = new JTextArea();
		textArea.setEditable(false);
		textArea.setBounds(12, 68, 588, 318);
		contentPane.add(textArea);
	}
}

 

ㅇUML

-프로그램 관련 모델링
객체 모델링 : 미리 클래스의 이름과 구조를 정하고 코딩 - UML
	클래스 다이어그램 : 클래스의 모습(멤버필드, 메서드)
	시퀀스 다이어그램 : 프로그램의 흐름을 묘사
	유스케이스 다이어그램 : 사용자 입장에서의 프로그램 흐름 묘사

손으로 그리든지 툴을 이용한다.
스타UML ( http://staruml.io )

이런것들을 미리 디자인해놓았다고 생각하면된다.


-데이터베이스 관련 모델링
데이터베이스 모델링 - ERD
	논리적 다이어그램
	물리적 다이어그램
	ERD그리는 홈페이지 http://ko.exerd.com/

보통 ERD - UML - UI (기획부분) - 코딩 - 완료보고서작성 순으로 프로젝트를 진행한다.

UML 참고 블로그

blog.naver.com/hack4ork/220416668639

 

UML Diagram

중요 - usecase, sequence, class, activity, statechart diagram맨 아래에 원본 출처가 있으나 링크가 없...

blog.naver.com

 

ㅇJCheckBox 사용하기

selected 체크하면 디폴트값으로 프로그램을 시작하면 해당 체크박스가 체크된 상태가 된다.

체크박스를 모두 전역변수로 바꿔준다.

이제 체크박스에 체크된 상태와 텍스트값을 출력해보자.

 

ㅇJRadioButton 사용하기

라디오버튼은 원래 단일선택이 돼야되지만 초기에는 다중선택이 된다. 

다중 선택하려면 라디오 버튼들을 그룹화하고 아래와 같이 오른쪽 클릭하고 버튼그룹으로 묶는다.

그러면 단일선택이 된다.

라디오버튼에서 체크한 상태로 버튼을 누르면 라디오 버튼의 텍스트값이 출력된다.

 

ㅇJOptionPane 사용하기(경고창)

또한 yes, no 옵션만 나오게 하고 yes나 no를 누르면 값이 출력하게 해보자.

이번에는 입력창을 만들어보자.

 

ㅇJProgressBar 사용하기

value값은 진행바의 값을 지정할 수 있고 위에 maximum과 minimum은 진행바의 최대 최소값을 정할 수 있다.

stringPainted를 true로 하면 현재 진행률이 %로 나온다.

또한 orientation을 버티컬로 바꾸면 진행바가 상하로 나온다.

 

다양한 차트를 만들고 싶으면 아래 웹페이지를 참고한다.

https://www.jfree.org/jfreechart/ 

 

JFreeChart

JFreeChart is a free 100% Java chart library that makes it easy for developers to display professional quality charts in their applications. JFreeChart's extensive feature set includes: For a closer look at JFreeChart, please browse the Samples and refer t

www.jfree.org

이제 전역변수로 바꾸고 버튼을 추가한다음 코드를 작성한다.

먼저 감소를 누르면 현재 진행상태에서 -10을하고, 증가를 누르면 현재 진행상태에서 +10을 한다.

현재 진행상태 출력 버튼을 누르면 이클립스에 현재 진행상태가 출력되도록 한다.

 

ㅇJSlider 사용하기

슬라이드를 움직이는 것을 틱이라고 한다.

또한 슬라이드를 움직이는 이벤트는 버튼이 아니다.

value는 슬라이더위치값, 최대최소는 범위, orientation은 수평, 수직을 설정하는 것이다.

majorTickspecial은 틱의  범위 값을 설정된 값으로 나눠주는 것이고

paintLables는 majorTickspecial의 값을 표시해주고

paintTrack은 눈금 표시를 만들어준다.

 

슬라이더는 마우스를 클릭했을 때의 이벤트와 드래그했을 때의 이벤트 두 가지로 나눠진다.

 

먼저 마우스 클릭했을 때를 알아보자.

바로 슬라이더에 마우스 우클릭을 하고 마우스 클릭했을 때의 이벤트를 만들자.

또한 슬라이더의 설정값에서 snapTotick을 하면 마우스를 클릭했을 때 10씩 움직인다.

 

이번에는 드래그했을 때를 확인해보자.

마우스 우클릭 -> add event handler -> mouseMotion -> mouseDragged를 누르면 이벤트 메소드가 생성된다.

 

ㅇ컬러 슬라이더바 만들기(색상혼합기 만들기)

아래 웹페이지를 참고해서 색상혼합기를 만든다.

www.w3schools.com/colors/colors_picker.asp

 

HTML Color Picker

Selected Color: Black Text Shadow White Text Shadow

www.w3schools.com

모두 전역변수로 만든다.

아래와 같이 코딩한다.

 

728x90
반응형
Comments