김미썸코딩

12/09 - GUI(2) : JCheckBox, JRadioButton, JOptionPane, JProgreeBar, JSlider 본문

빅데이터 플랫폼 구축을 위한 자바 개발자 양성과정

12/09 - GUI(2) : JCheckBox, JRadioButton, JOptionPane, JProgreeBar, JSlider

김미썸 2020. 12. 10. 23:06
728x90

 

UI

            C(T)UI

            GUI

                        사용자 인터페이스(2D Graphic)

                        Widget

                                  Container              - Container, Component(Widget이라고 부르기도 함)

                                             Window(X)

                                             JFrame         - 프로그램당 1개

                                             JDialogue     - JFrame 의 자식창

                                             JPanel          - Component 그룹

                                  Component

                                             JLabel

                                             JButton

                                             JTextField / JPasswordField / JTextArea

                        LayoutManager

                                  Absolute LayoutManager(Null LayoutManager)  -  좌표중심

                        Event(*)

                                Event 중심의 프로그램 방식

                                마우스 클릭이벤트 선언법을 암기

                                             => 익명 이너클래스 구조

 

GUI

                       Design         - Window Builder (Android - xml)

                                            Container

                                             LayoutManager

                                             Component

                                             Event

                       Coding        - eclipse / 별도 프로그램

                                             Event 나머지

                                             * DAO / TO

 

 

 


 

※ 응용 문제 풀이

동이름 받아서 출력

SearchZipcodeEx03

ZipcodeSearchUI01.java

(1) 작성 전

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 java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.border.TitledBorder;
import javax.swing.UIManager;
import java.awt.Color;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class ZipcodeSearchUI01 extends JFrame {

	private JPanel contentPane;
	private JTextField textField;
	private JPanel panel;

	/**
	 * 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("우편번호 검색기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 436, 481);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		panel = new JPanel();
		panel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "\uC6B0\uD3B8\uBC88\uD638 \uAC80\uC0C9", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
		panel.setBounds(12, 10, 396, 53);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("동이름 입력");
		lblNewLabel.setBounds(12, 21, 94, 15);
		panel.add(lblNewLabel);
		
		textField = new JTextField();
		textField.setBounds(89, 18, 185, 21);
		panel.add(textField);
		textField.setColumns(10);
		
		JButton btn = new JButton("검색하기");
		btn.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				
			}
		});
		btn.setBounds(287, 17, 97, 23);
		panel.add(btn);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 67, 396, 365);
		contentPane.add(scrollPane);
		
		JTextArea textArea = new JTextArea();
		textArea.setEditable(false);
		scrollPane.setViewportView(textArea);
		btn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
			}
		});
	}
}

(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 java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.border.TitledBorder;
import javax.swing.UIManager;
import java.awt.Color;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
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;

public class ZipcodeSearchUI02 extends JFrame {

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

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

	/**
	 * Create the frame.
	 */
	public ZipcodeSearchUI02() {
		setTitle("우편번호 검색기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 436, 481);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		panel = new JPanel();
		panel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "\uC6B0\uD3B8\uBC88\uD638 \uAC80\uC0C9", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
		panel.setBounds(12, 10, 396, 53);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("동이름 입력");
		lblNewLabel.setBounds(12, 21, 94, 15);
		panel.add(lblNewLabel);
		
		textField = new JTextField();
		textField.setBounds(89, 18, 185, 21);
		panel.add(textField);
		textField.setColumns(10);
		
		JButton btn = new JButton("검색하기");
		btn.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				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 address = String.format("[%s] %s %s %s %s %s\n",
								zipcode, sido, gugun, dong, ri, bunji);
						textArea.append(address);
					}
				} catch (ClassNotFoundException e) {
					System.out.println("[에러]" + e.getMessage());
				} catch (SQLException e) {
					System.out.println("[에러]" + e.getMessage());
				} finally {
					if(rs != null) try {rs.close();} catch(SQLException e) {}
					if(pstmt != null) try {pstmt.close();} catch(SQLException e) {}
					if(conn != null) try {conn.close();} catch(SQLException e) {}
				}
			}
		});
		btn.setBounds(287, 17, 97, 23);
		panel.add(btn);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 67, 396, 365);
		contentPane.add(scrollPane);
		
		textArea = new JTextArea();
		textArea.setEditable(false);
		scrollPane.setViewportView(textArea);
		btn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
			}
		});
	}
}

(3) 메서드화, 객체화 (DAO, DTO)

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 java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.border.TitledBorder;

import model1.ZipcodeDAO;
import model1.ZipcodeTO;

import javax.swing.UIManager;
import java.awt.Color;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
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 ZipcodeSearchUI03 extends JFrame {

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

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

	/**
	 * Create the frame.
	 */
	public ZipcodeSearchUI03() {
		setTitle("우편번호 검색기");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 436, 481);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		panel = new JPanel();
		panel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "\uC6B0\uD3B8\uBC88\uD638 \uAC80\uC0C9", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
		panel.setBounds(12, 10, 396, 53);
		contentPane.add(panel);
		panel.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("동이름 입력");
		lblNewLabel.setBounds(12, 21, 94, 15);
		panel.add(lblNewLabel);
		
		textField = new JTextField();
		textField.setBounds(89, 18, 185, 21);
		panel.add(textField);
		textField.setColumns(10);
		
		JButton btn = new JButton("검색하기");
		btn.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				// 초기화 작업
				textArea.setText("");
				
				String strDong = textField.getText();
				
				try {
					ZipcodeDAO dao = new ZipcodeDAO();
					ArrayList<ZipcodeTO> addresses = dao.searchZipcode(strDong);
					
					StringBuffer result = new StringBuffer();
					
					for(ZipcodeTO address: addresses) {
						// String strAddress = string.format("[%s] %s %s %s %s %s\n",
						// 					address.getZipcode(),address.getSido(),address.getGugun(),
						//					address.getDong(),address.getRi(),address.getBunji());
						// textArea.append(strAddress);
						result.append("["+address.getZipcode()+"]");
						result.append(address.getSido()+",");
						result.append(address.getGugun()+",");
						result.append(address.getDong()+",");
						result.append(address.getRi()+",");
						result.append(address.getBunji()+"\n");
					}
					textArea.append(result.toString());
					
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		btn.setBounds(287, 17, 97, 23);
		panel.add(btn);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(12, 67, 396, 365);
		contentPane.add(scrollPane);
		
		textArea = new JTextArea();
		textArea.setEditable(false);
		scrollPane.setViewportView(textArea);
		
		btn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
			}
		});
	}
}

-- DAO

package model1;
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{
		
		String url = "jdbc:mysql://localhost:3307/sample";
		String user = "root";
		String password = "!123456";
		
		Class.forName("org.mariadb.jdbc.Driver");
		this.conn = DriverManager.getConnection(url, user, password);
		// Connection conn = DriverManager.getConnection(url, user, password);
	}
	
	// SQL 구문별 메소드  - 동이름과 함께 호출되는 메서드는 그 결과값을 ArrayList<ZipcodeTO>로 리턴
	public ArrayList<ZipcodeTO> searchZipcode(String strDong) throws ClassNotFoundException, SQLException{
		ArrayList<ZipcodeTO> result = new ArrayList<ZipcodeTO>();
		
		String sql = "select zipcode, sido, gugun, dong, ri, bunji, seq 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");
			String seq = rs.getString("seq");
			
			ZipcodeTO to = new ZipcodeTO(zipcode, sido, gugun, dong, ri, bunji, seq);
			*/
			
			// setter 사용
			ZipcodeTO to = new ZipcodeTO();
			to.setZipcode(rs.getString("zipcode"));
			to.setSido(rs.getString("sido"));
			to.setGugun(rs.getString("gugun"));
			to.setDong(rs.getString("dong"));
			to.setRi(rs.getString("ri"));
			to.setBunji(rs.getString("bunji"));
			
			result.add(to);
		}
		
		return result;
	}

}

-- DTO

 

package model1;

public class ZipcodeTO {
	// DAO로 받아온 값들을 조작할 수 있게 선언
	private String zipcode;
	private String sido;
	private String gugun;
	private String dong;
	private String ri;
	private String bunji;
	private String seq;
	
	// 생성자  - setter
	/*
	public ZipcodeTO(String zipcode, String sido, String gugun, String dong, String ri, String bunji, String seq){
		this.zipcode = zipcode;
		this.sido = sido;
		this.gugun = gugun;
		this.dong = dong;
		this.ri = ri;
		this.bunji = bunji;
		this.seq = seq;
	}
	*/
	
	// setter
	public String getZipcode() {
		return zipcode;
	}

	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}

	public String getSido() {
		return sido;
	}

	public void setSido(String sido) {
		this.sido = sido;
	}

	public String getGugun() {
		return gugun;
	}

	public void setGugun(String gugun) {
		this.gugun = gugun;
	}

	// getter
	public String getDong() {
		return dong;
	}

	public void setDong(String dong) {
		this.dong = dong;
	}

	public String getRi() {
		return ri;
	}

	public void setRi(String ri) {
		this.ri = ri;
	}

	public String getBunji() {
		return bunji;
	}

	public void setBunji(String bunji) {
		this.bunji = bunji;
	}

	public String getSeq() {
		return seq;
	}

	public void setSeq(String seq) {
		this.seq = seq;
	}
	
	
	
	
}

 

 

객체 모델링 - UML

             클래스 다이어그램  -  클래스의 모습(멤버필드, 메서드)

             시쿼스 다이어그램  -  프로그램의 흐름

             유스케이스 다이어그램  -  사용자입장에서 흐름

 

             * 손

             * 스타 UML (http://staruml.io)

데이터베이스

데이터베이스 모델링

             논리적 다이어그램

             물리적 다이어그램(http://ko.exerd.com/)

 

 

 

 

 

***입력장치 추가

1. JCheckBox

JCheckBoxEX01.java

체크박스에 체크된 값만 콘솔창에 나오게

    → if-else아니고 if다.     왜? 다중선택이기 때문에

 

2. JRadioButton (단일 선택)

JRadioButtonEx01.java

만들면 다중선택이 되어 있어서 뭔갈 바꿔줘야함

 

 

***경고창

1. JOptionPane

JOptionPaneEx01.java

1) 경고창

JOptionPane.showMessageDialog(JOptionPaneEx01.this, "메시지");

JOptionPane.showMessageDialog(JOptionPaneEx01.this, "메시지","타이틀",JOptionPane.WARNING_MESSAGE);

JOptionPane.showMessageDialog(JOptionPaneEx01.this, "메시지","타이틀",JOptionPane.QUESTION_MESSAGE);

 

2) 확인창 - 리턴값이 있음

int result = JOptionPane.showConfirmDialog(JOptionPaneEx01.this,"메시지");
System.out.println(result);

 

int result = JOptionPane.showConfirmDialog(JOptionPaneEx01.this,"메시지","타이틀",JOptionPane.OK_CANCEL_OPTION);
System.out.println(result);

int result = JOptionPane.showConfirmDialog(JOptionPaneEx01.this,"메시지","타이틀",JOptionPane.YES_NO_OPTION);
System.out.println(result);

 

3) 입력창 - 리턴값이 있음(null / 입력값)

JOptionPane.showInputDialog(JOptionPaneEx01.this, "메시지");

 

String msg = JOptionPane.showInputDialog(JOptionPaneEx01.this, "메시지","타이틀",JOptionPane.YES_NO_OPTION);
System.out.println(msg);

 

 

 

*** 진행 상태

1. JProgreeBar

JProgressBarEx01.java

value 값을 조절해라 (getter, setter 사용)

maximum, minimum

 

그래프 만들고 싶으면 (https://www.jfree.org/jfreechart)

 

 

System.out.println(progressBar.getValue());

 

 

실습1) '감소' 버튼 누르면 -10, '증가' 버튼 누르면 +10 되는 progressBar 만들기

버튼이 클릭될 때 메서드에  아래와 같은 코드를 넣으면 된다.

progressBar.setValue(progressBar.getValue() - 10);
progressBar.setValue(progressBar.getValue() + 10);

 

 

 

2. JSlider

value, maximum, minimum

majorTickSpacing, paintLabels, paintTicks

 

클릭할때마다 움직이는 값이 나오게

public void mouseClicked(MouseEvent e) {
    System.out.println(slider.getValue());
}

 

 

 

  • stateChange : tick을 드래그 해서 움직이면 값이 쫘라락 출력된다.

 

 

  • snapToTicks : 클릭할때 끊어서 10씩 끊어서 움직인다.

 

 

실습2) slider로 color picker 만들기

null에 주의 해야함!

3개의 slider와 색을 표현할 JPanel을 모두 멤버변수로 선언해야한다.

3개의 slider는 모두 다음과 같이 설정하였다.

JPanel의 초기 배경색은 WHITE로 하였다.

그리고 3가지 Slider 모두 같은 코드가 추가된다.

이벤트를 mouse가 아닌 change로 주는데 아래의 코드의 코드를 추가한다.

public void stateChanged(ChangeEvent e) {
    if(panel != null) {
        panel.setBackground(new Color(slider1.getValue(),slider2.getValue(), slider3.getValue()));
    }
}

 

 

 

 

※ 시험 문제 힌트

1. java.lang

           Object 클래스  -  최상위 클래스

Object 클래스는

 

 

2. String / StringBuffer 차이 뭐가 좋은지

String은불변(immutable)의 속성을 갖는다.

변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용해 주시면 좋은 성능을 기대할 수 있습니다. 그러나 문자열 추가,수정,삭제 등의 연산이 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 힙 메모리(Heap)에 많은 임시 가비지(Garbage)가 생성되어 힙메모리가 부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 됩니다.

String 과는 반대로 StringBuffer/StringBuilder 는 가변성 가지기 때문에 .append() .delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능합니다. 따라서 문자열의 추가,수정,삭제가 빈번하게 발생할 경우라면 String 클래스가 아닌 StringBuffer/StringBuilder를 사용하셔야 합니다.

3. Wrapper 클래스 개념과 종류

  • 기본자료형을 객체로 감싼다. 기본타입의 값을 내부에 두고 포장한다.
  • 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다. 만약 내부의 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 한다.
  • 객체와 일반변수를 왔다 갔다 할 수 있는것이 Wrapper다.
  • 기본데이터타입처럼 연산도 가능하다.
  • toString(): 숫자 10을 문자 "10"으로 바꿀 수 있다.
  • parseInt(): 문자 "999"를 숫자 999로 바꿀 수 있다.
  • parseDouble() : 문자 "99.9"를 숫자 99.9로 바꿀 수 있다.  

 

  • byte  : Byte
  • short  : Short
  • int  : Integer
  • long  : Long

 

  • float  : Float
  • double  : Double

 

  • char  : Character
  • boolean : Boolean

 

4. 컬렉션 프레임 워크

           list / set / map 차이점

5. 멀티 스레드 프로그래밍의 장단점

   장점 : cpu 사용률 증가, 작업의 분리로 응답성 향상, 자원의 효율적 공유, 코드가 간결해짐

   단점 : 멀티쓰레드 프로세스는 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 때문에 

              동기화(Synchronization) , 교착상태(Deadlock) 와 같은 문제들이 발생할 수가 있다.

 

6. 스레드의 라이프 사이클

 

 

7. 파일 입출력을 위한 클래스의 종류 (바이트기반, 문자기반 구별)

  • 바이트 기반 : FileInputStream, FileOutputStream
  • 문자 기반 : FileReader, FileWriter

 

8. 2차 스트림

  • BufferedReader / BufferedWriter : 버퍼를 이용해서 입출력의 효율을 높일수 있도록 해주는 역할을 한다.
  • InputStreamReader / OutputStreamWriter : 바이트 기반 스트림을 문자기반 스트림으로 연결시켜주는 역할을 한다. 

 

 

+ sql 

 

Swing > 미니프로젝트(html/css/js) -> jsp

728x90
Comments