우편번호 시스템과 연결지어 연동시켜보자 .
아이디어
우편번호 검색기 클래스를 전역변수 자리에서 생성한다.
MemberShipView가 생성될 때 그 때 생성이 된다. -> 생성자를 통해서 전역변수를 초기화 하기 때문에 이 때 로딩이 된다.
idea(1)
public static void main(String[] args) {
MemberShipView ms = new MemberShipView();
ms.initDisplay();
}
idea(2) - 전역변수 선언부
//우편번호 검색기 클래스를 전역변수 자리에서 생성한다.
ZipCodeView zv = new ZipCodeView(this);
// 이 자리에 파라미터 자리에 this를 쓸 수 있는 건 이 어플리케이션을 실행 했을 때 비로소 객체가 로딩된다.
idea(3) - ZipCodeView 생성자
DBConnectionMgr dbMgr = null;//싱글톤 패턴으로 관리한다. 복제본을 만들지 않는다. 절대로....
//MemberShip memberShip = null;
//생성자
MemberShipView memberShipView = null;
public ZipCodeView() {
}
public ZipCodeView(MemberShipView memberShipView) {
this.memberShipView = memberShipView;
}
MemberShipView memberShipView = null;
null이 뭔가를 가리키는 시점은 ZipCodeView 생성자가 호출 될 때 로딩된다.package com.chat;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
public class MemberShipView extends JDialog implements ActionListener{
//선언부
JPanel jp_center = new JPanel();
JLabel jlb_id = new JLabel("아이디");
JTextField jtf_id = new JTextField(10);
JLabel jlb_pw = new JLabel("패스워드");
JTextField jtf_pw = new JTextField(10);
JLabel jlb_nickName = new JLabel("대화명");
JTextField jtf_nickName = new JTextField(20);
JLabel jlb_name = new JLabel("성명");
JTextField jtf_name = new JTextField(30);
JLabel jlb_gender = new JLabel("성별");
String[] genderList = {"남자","여자"};
JComboBox jcb_gender = new JComboBox(genderList);
JLabel jlb_zipcode = new JLabel("우편번호");
public JTextField jtf_zipcode = new JTextField(6);
JLabel jlb_address = new JLabel("주소");
public JTextField jtf_address = new JTextField(100);
JButton jbtn_zipcode = new JButton("우편번호찾기");
JScrollPane jsp = null;
JPanel jp_south = new JPanel();
JButton jbtn_ins = new JButton("등록");
JButton jbtn_close = new JButton("닫기");
//생성자
public MemberShipView(){
//initDisplay();
}
//화면처리부
public void initDisplay() {
jbtn_zipcode.addActionListener(this);
jp_center.setLayout(null);
jlb_id.setBounds(20, 20, 100, 20);
jtf_id.setBounds(120, 20, 120, 20);
jlb_pw.setBounds(20, 45, 100, 20);
jtf_pw.setBounds(120, 45, 120, 20);
jlb_nickName.setBounds(20, 70, 100, 20);
jtf_nickName.setBounds(120, 70, 150, 20);
jlb_name.setBounds(20, 95, 100, 20);
jtf_name.setBounds(120, 95, 150, 20);
jlb_gender.setBounds(20, 120, 100, 20);
jcb_gender.setBounds(120, 120, 150, 20);
jcb_gender.setFont(new Font("굴림",1,14));
jlb_zipcode.setBounds(20, 145, 100, 20);
jtf_zipcode.setBounds(120, 145, 100, 20);
jbtn_zipcode.setBounds(230, 145, 120, 20);
jlb_address.setBounds(20, 170, 100, 20);
jtf_address.setBounds(120, 170, 250, 20);
jp_center.add(jlb_id);
jp_center.add(jtf_id);
jp_center.add(jlb_pw);
jp_center.add(jtf_pw);
jp_center.add(jlb_nickName);
jp_center.add(jtf_nickName);
jp_center.add(jlb_name);
jp_center.add(jtf_name);
jp_center.add(jlb_gender);
jp_center.add(jcb_gender);
jp_center.add(jlb_zipcode);
jp_center.add(jtf_zipcode);
jp_center.add(jbtn_zipcode);
jp_center.add(jlb_address);
jp_center.add(jtf_address);
jp_south.setLayout(new FlowLayout(FlowLayout.RIGHT));
jp_south.add(jbtn_ins);
jp_south.add(jbtn_close);
this.add("South",jp_south);
jsp = new JScrollPane(jp_center);
this.add("Center",jsp);
this.setTitle("회원가입");
this.setSize(400, 500);
this.setVisible(true);
}
public static void main(String[] args) {
MemberShipView ms = new MemberShipView();
ms.initDisplay();
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("action");
Object obj = e.getSource();
if(obj == jbtn_zipcode) {
//insert here 우편번호 검색기
}
}
}
package com.chat;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import com.util.DBConnectionMgr;
public class ZipCodeView extends JFrame implements ActionListener, FocusListener, MouseListener {
//선언부
String zdo = null;
//물리적으로 떨어져 있는 db서버와 연결통로 만들기
Connection con = null;
//위에서 연결되면 쿼리문을 전달할 전령의 역할을 하는 인터페이스 객체 생성하기
PreparedStatement pstmt = null;
//조회된 결과를 화면에 처리해야 하므로 오라클에 커서를 조작하기 위해 ResultSet추가
ResultSet rs = null;
//JFrame 은 기본적으로 BorderLayout이다(동,서,남,북,중앙 배치)
//디폴트는 FlowLayout, -> BorderLayout -> setLayout
//jp_north.add("Center", jtf_dong)
//jp_north.add("West",jbtn_search)
JPanel jp_north = new JPanel();//Div태그 span생각
//insert here
String zdos[] = {"전체","서울","경기","강원"};
String zdos2[] = {"전체","부산","전남","대구"};
Vector<String> vzdos = new Vector<>();//vzdos.size()==>0
JComboBox jcb_zdo = new JComboBox(zdos);//West
JComboBox jcb_zdo2 = null;//West
JTextField jtf_search = new JTextField("동이름을 입력하세요.");//Center
JButton jbtn_search = new JButton("조회");//East
String cols[] = {"우편번호","주소"};
String data[][] = new String[0][2];
DefaultTableModel dtm_zipcode = new DefaultTableModel(data,cols);
JTable jtb_zipcode = new JTable(dtm_zipcode);
JTableHeader jth = jtb_zipcode.getTableHeader();
JScrollPane jsp_zipcode = new JScrollPane(jtb_zipcode
,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED
,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
String zdos3[] = null;
DBConnectionMgr dbMgr = null;//싱글톤 패턴으로 관리한다. 복제본을 만들지 않는다. 절대로....
MemberShipView memberShipView = null;//null이 뭔가를 가리키는 시점은 ZipCodeVIew생성자가 호출될때
//생성자
public ZipCodeView() {
}
public ZipCodeView(MemberShipView memberShipView) {
this.memberShipView = memberShipView;// 재정의, 치환하기
}
//화면처리부
public void initDisplay() {
jtb_zipcode.requestFocus();
jtf_search.addFocusListener(this);
jtb_zipcode.addMouseListener(this);
jbtn_search.addActionListener(this);
jtf_search.addActionListener(this);
//북쪽 배치하는 속지를 FlowLayout-> 동서남북중앙 - UI솔루션
jp_north.setLayout(new BorderLayout());
/* */
//vzdos.copyInto(zdos2);
for(int x=0;x<zdos2.length;x++) {
vzdos.add(zdos2[x]);
}
for(String s:vzdos) {
System.out.println("s===>"+s);
}
//jcb_zdo2 = new JComboBox(zdos3);//West
//jp_north.add("East",jcb_zdo2);
jp_north.add("Center",jtf_search);
jp_north.add("East",jbtn_search);
this.add("North",jp_north);
this.add("Center",jsp_zipcode);
this.setTitle("우편번호 검색");
this.setSize(430, 400);
this.setVisible(true);
}
//메인메소드
public static void main(String[] args) {
ZipCodeView zcs = new ZipCodeView();
zcs.initDisplay();//화면이 먼저 열리도록 하고 오라클서버를 나중에 연결하자
//zcs.refreshData("가산");
}
/******************************************************
* 사용자로부터 동이름을 입력 받아서 조건 검색을 구현하기
* @param dong - 동이름
* sql문
SELECT zipcode, address - 두 개의 컬럼이 DTO or Map - > List담아라 - > row레벨을 담는다
FROM zipcode_t
WHERE dong LIKE ?||'%';
* 화면이 존재하는 경우 DB서버에서 가져온 정보를 가지고 후처리를 해야 함
* return타입을 void로 했으니까 이 메소드에서 화면처리까지 진행함
* UI - react - 화면과 로직(Model계층-UI+데이터셋만난다) 분리 -
* 데이터셋에 데이터를 추가하는 것은 row단위(1차배열, Vector)로 처리된다
* DefaultTableModel -> addRow(Objectr[]), addRow(Vector)
* ClassNotFoundException - > ojdbc6.jar -> build path
* NullPointerException발동 -> con.prepareStatement("SELECT문"); - con이 널이다. ip주소, port:1521, 1522, `1523
* scott/tiger - 인증실패관련메시지
* sid가 이미 설치된 컴터 orcl
* SQLException은 sql문의 오류이다. 자바의 문제가 아님 - 토드에서 단위테스트 해볼것.
******************************************************/
public void refreshData(String dong) {
List<Map<String,Object>> list = new ArrayList<>();
StringBuilder sql = new StringBuilder();
sql.append("SELECT zipcode, address ");
sql.append(" FROM zipcode_t ");
sql.append(" WHERE dong LIKE ?||'%'");
dbMgr = DBConnectionMgr.getInstance();
try {
con = dbMgr.getConnection();//물리적으로 떨어져 있는 서버와 연결통로 확보
pstmt = con.prepareStatement(sql.toString());//쿼리문을 먼저 스캔하여 있을 지 모르는 변수의 자리를 치환할것.
pstmt.setString(1, dong);//dong, 당산, 가산, 공덕
rs = pstmt.executeQuery();
Map<String,Object> rmap = null;
while(rs.next()) {
rmap = new HashMap<>();
rmap.put("zipcode", rs.getInt("zipcode"));
rmap.put("address", rs.getString("address"));
list.add(rmap);
}
System.out.println(list);//주소번지가 33번 출력될것이다. - 단위테스트 하자
//메소드 설계가 리턴타입이 빠져 있으므로 화면 처리까지 여기서 해야 함.
for(int i=0;i<list.size();i++) {//33번 반복됨 - row수
Map<String, Object> map = list.get(i);
Vector<Object> v = new Vector<>();
v.add(0,map.get("zipcode"));
v.add(1,map.get("address"));
dtm_zipcode.addRow(v);
}
} catch (SQLException se) {
System.out.println(sql.toString());//출력된 쿼리문을 갈무리해서 토드에서 확인해 볼것.
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if(obj == jbtn_search || obj == jtf_search) {
System.out.println(jtf_search.getText());//당산
String dong = jtf_search.getText();
refreshData(dong);
}
}
@Override
public void focusGained(FocusEvent e) {
Object obj = e.getSource();
if(obj == jtf_search) {
jtf_search.setText("");
}
}
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
if(e.getClickCount()==2) {//더블클릭한거야?
//화면 테이블에서 더블클릭했을 때 선택된 로우의 index값을 반환해줌
int index = jtb_zipcode.getSelectedRow();//1.8부터 오토박싱을 통해서 int와 Wrapper클래스는 자동으로 형전환
int zipcode = (int)dtm_zipcode.getValueAt(index, 0);//선택된 로우의 우편번호가 담김
String address = (String)dtm_zipcode.getValueAt(index, 1);
System.out.println(zipcode +", "+ address);//
//insert here - 부모창인 회원가입 창에서 우편번호 와 주소자리(MemberShipView)에 조회된 결과를 자동으로 출력해줌
//부모(MemberShipView)의 주소번지가 필요하다.
//valueOf메소드의 파라미터자리에 어떤 값이 오든 String 타입으로 형전환해주는 메소드 이다.
//관전 포인트 하나더 - 싱글톤으로 제공되는 메소드 입니다.
//MemberShipView를 인스턴스화 하면 그 때 즉시 전역변수의 ZipCodeView객체가 생성되고 이때 파라미터 자리에 this는
//앞에 인스턴스화를 통해 현재 로딩 중인 그 원본이므로 복사본이 아니다.
memberShipView.jtf_zipcode.setText(String.valueOf(zipcode));
memberShipView.jtf_address.setText(String.valueOf(address));
}
}
@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 com.chat;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import com.step6.ZipCodeView;
public class MemberShipView extends JDialog implements ActionListener{
//선언부
JPanel jp_center = new JPanel();
JLabel jlb_id = new JLabel("아이디");
JTextField jtf_id = new JTextField(10);
JLabel jlb_pw = new JLabel("패스워드");
JTextField jtf_pw = new JTextField(10);
JLabel jlb_nickName = new JLabel("대화명");
JTextField jtf_nickName = new JTextField(20);
JLabel jlb_name = new JLabel("성명");
JTextField jtf_name = new JTextField(30);
JLabel jlb_gender = new JLabel("성별");
String[] genderList = {"남자","여자"};
JComboBox jcb_gender = new JComboBox(genderList);
JLabel jlb_zipcode = new JLabel("우편번호");
public JTextField jtf_zipcode = new JTextField(6);
JLabel jlb_address = new JLabel("주소");
public JTextField jtf_address = new JTextField(100);
JButton jbtn_zipcode = new JButton("우편번호찾기");
JScrollPane jsp = null;
JPanel jp_south = new JPanel();
JButton jbtn_ins = new JButton("등록");
JButton jbtn_close = new JButton("닫기");
//우편번호 검색기 클래스를 전역변수 자리에서 생성한다.
ZipCodeView zv = new ZipCodeView(this);
// 이 자리에 파라미터 자리에 this를 쓸 수 있는 건 이 어플리케이션을 실행 했을 때 비로소 객체가 로딩된다.
// MemberShipView가 생성될 때 그 때 생성이 된다.
//생성자
public MemberShipView(){
//initDisplay();
}
//화면처리부
public void initDisplay() {
jbtn_zipcode.addActionListener(this);
jp_center.setLayout(null);
jlb_id.setBounds(20, 20, 100, 20);
jtf_id.setBounds(120, 20, 120, 20);
jlb_pw.setBounds(20, 45, 100, 20);
jtf_pw.setBounds(120, 45, 120, 20);
jlb_nickName.setBounds(20, 70, 100, 20);
jtf_nickName.setBounds(120, 70, 150, 20);
jlb_name.setBounds(20, 95, 100, 20);
jtf_name.setBounds(120, 95, 150, 20);
jlb_gender.setBounds(20, 120, 100, 20);
jcb_gender.setBounds(120, 120, 150, 20);
jcb_gender.setFont(new Font("굴림",1,14));
jlb_zipcode.setBounds(20, 145, 100, 20);
jtf_zipcode.setBounds(120, 145, 100, 20);
jbtn_zipcode.setBounds(230, 145, 120, 20);
jlb_address.setBounds(20, 170, 100, 20);
jtf_address.setBounds(120, 170, 250, 20);
jp_center.add(jlb_id);
jp_center.add(jtf_id);
jp_center.add(jlb_pw);
jp_center.add(jtf_pw);
jp_center.add(jlb_nickName);
jp_center.add(jtf_nickName);
jp_center.add(jlb_name);
jp_center.add(jtf_name);
jp_center.add(jlb_gender);
jp_center.add(jcb_gender);
jp_center.add(jlb_zipcode);
jp_center.add(jtf_zipcode);
jp_center.add(jbtn_zipcode);
jp_center.add(jlb_address);
jp_center.add(jtf_address);
jp_south.setLayout(new FlowLayout(FlowLayout.RIGHT));
jp_south.add(jbtn_ins);
jp_south.add(jbtn_close);
this.add("South",jp_south);
jsp = new JScrollPane(jp_center);
this.add("Center",jsp);
this.setTitle("회원가입");
this.setSize(400, 500);
this.setVisible(true);
}
public static void main(String[] args) {
MemberShipView ms = new MemberShipView();
ms.initDisplay();
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("action");
Object obj = e.getSource();
if(obj == jbtn_zipcode) {
zv.initDisplay();
}
}
}
zv.refreshData(getName());
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("action");
Object obj = e.getSource();
if(obj == jbtn_zipcode) {
zv.initDisplay();
zv.refreshData(getName());
}
다음 요구사항
더블클릭 후 입력 될 수 있도록 하자. MouseListener를 이용하면 된다.
mouselistener
인터페이스 추가
int zipcode, String adress 두 개를 가져와야함
package com.step6;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import com.chat.MemberShipView;
import com.util.DBConnectionMgr;
public class ZipCodeView extends JFrame implements ActionListener, FocusListener , MouseListener{
//선언부
String zdo = null;
//물리적으로 떨어져 있는 db서버와 연결통로 만들기
Connection con = null;
//위에서 연결되면 쿼리문을 전달할 전령의 역할을 하는 인터페이스 객체 생성하기
PreparedStatement pstmt = null;
//조회된 결과를 화면에 처리해야 하므로 오라클에 커서를 조작하기 위해 ResultSet추가
ResultSet rs = null;
//JFrame 은 기본적으로 BorderLayout이다(동,서,남,북,중앙 배치)
//디폴트는 FlowLayout, -> BorderLayout -> setLayout
//jp_north.add("Center", jtf_dong)
//jp_north.add("West",jbtn_search)
JPanel jp_north = new JPanel();//Div태그 span생각
//insert here
String zdos[] = {"전체","서울","경기","강원"};
String zdos2[] = {"전체","부산","전남","대구"};
Vector<String> vzdos = new Vector<>();//vzdos.size()==>0
JComboBox jcb_zdo = new JComboBox(zdos);//West
JComboBox jcb_zdo2 = null;//West
JTextField jtf_search = new JTextField("동이름을 입력하세요.");//Center
JButton jbtn_search = new JButton("조회");//East
String cols[] = {"우편번호","주소"};
String data[][] = new String[0][2];
DefaultTableModel dtm_zipcode = new DefaultTableModel(data,cols);
JTable jtb_zipcode = new JTable(dtm_zipcode);
JTableHeader jth = jtb_zipcode.getTableHeader();
JScrollPane jsp_zipcode = new JScrollPane(jtb_zipcode
,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED
,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
String zdos3[] = null;
DBConnectionMgr dbMgr = null;//싱글톤 패턴으로 관리한다. 복제본을 만들지 않는다. 절대로....
//MemberShip memberShip = null;
//생성자
MemberShipView memberShipView = null;
public ZipCodeView() {
}
public ZipCodeView(MemberShipView memberShipView) {
this.memberShipView = memberShipView;
}
//화면처리부
public void initDisplay() {
jtb_zipcode.requestFocus();
jtf_search.addFocusListener(this);
jtb_zipcode.addMouseListener(this);
jbtn_search.addActionListener(this);
jtf_search.addActionListener(this);
//북쪽 배치하는 속지를 FlowLayout-> 동서남북중앙 - UI솔루션
jp_north.setLayout(new BorderLayout());
/* */
//vzdos.copyInto(zdos2);
for(int x=0;x<zdos2.length;x++) {
vzdos.add(zdos2[x]);
}
for(String s:vzdos) {
System.out.println("s===>"+s);
}
//jcb_zdo2 = new JComboBox(zdos3);//West
//jp_north.add("East",jcb_zdo2);
jp_north.add("Center",jtf_search);
jp_north.add("East",jbtn_search);
this.add("North",jp_north);
this.add("Center",jsp_zipcode);
this.setTitle("우편번호 검색");
this.setSize(430, 400);
this.setVisible(true);
}
//메인메소드
public static void main(String[] args) {
ZipCodeView zcs = new ZipCodeView();
zcs.initDisplay();//화면이 먼저 열리도록 하고 오라클서버를 나중에 연결하자
//zcs.refreshData("가산");
}
public void refreshData(String dong) {
List<Map<String,Object>> list = new ArrayList<>();
StringBuilder sql = new StringBuilder();
sql.append("SELECT zipcode, address ");
sql.append(" FROM zipcode_t ");
sql.append(" WHERE dong LIKE ?||'%'");
dbMgr = DBConnectionMgr.getInstance();
try {
con = dbMgr.getConnection();//물리적으로 떨어져 있는 서버와 연결통로 확보
pstmt = con.prepareStatement(sql.toString());//쿼리문을 먼저 스캔하여 있을 지 모르는 변수의 자리를 치환할것.
pstmt.setString(1, dong);//dong, 당산, 가산, 공덕
rs = pstmt.executeQuery();
Map<String,Object> rmap = null;
while(rs.next()) {
rmap = new HashMap<>();
rmap.put("zipcode", rs.getInt("zipcode"));
rmap.put("address", rs.getString("address"));
list.add(rmap);
}
System.out.println(list);//주소번지가 33번 출력될것이다. - 단위테스트 하자
//메소드 설계가 리턴타입이 빠져 있으므로 화면 처리까지 여기서 해야 함.
for(int i=0;i<list.size();i++) {//33번 반복됨 - row수
Map<String, Object> map = list.get(i);
Vector<Object> v = new Vector<>();
v.add(0,map.get("zipcode"));
v.add(1,map.get("address"));
dtm_zipcode.addRow(v);
}
} catch (SQLException se) {
System.out.println(sql.toString());//출력된 쿼리문을 갈무리해서 토드에서 확인해 볼것.
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if(obj == jbtn_search || obj == jtf_search) {
System.out.println(jtf_search.getText());//당산
String dong = jtf_search.getText();
refreshData(dong);
}
}
@Override
public void focusGained(FocusEvent e) {
Object obj = e.getSource();
if(obj == jtf_search) {
jtf_search.setText("");
}
}
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
if(e.getClickCount() == 2) // 더블클릭 한거야?
{
int index = jtb_zipcode.getSelectedRowCount();
int zipcode =(int) dtm_zipcode.getValueAt(index, 0);
String adress = (String) dtm_zipcode.getValueAt(index, 1);
System.out.println(zipcode + "," + adress);
/*
* 부모창인 회원가입 창에서 우편번호아 주소자리(MemberShipView)에 조회된 결과를 자동으로 출력해줌
* 부모(MemberShipView)의 주소 번지가 필요하다.
*/
}
}
@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
}
}
public void initDisplay() {
jtb_zipcode.requestFocus();
jtf_search.addFocusListener(this);
jtb_zipcode.addMouseListener(this);
jbtn_search.addActionListener(this);
jtf_search.addActionListener(this);
//북쪽 배치하는 속지를 FlowLayout-> 동서남북중앙 - UI솔루션
jp_north.setLayout(new BorderLayout());
/* */
//vzdos.copyInto(zdos2);
for(int x=0;x<zdos2.length;x++) {
vzdos.add(zdos2[x]);
}
for(String s:vzdos) {
System.out.println("s===>"+s);
}
//jcb_zdo2 = new JComboBox(zdos3);//West
//jp_north.add("East",jcb_zdo2);
jp_north.add("Center",jtf_search);
jp_north.add("East",jbtn_search);
this.add("North",jp_north);
this.add("Center",jsp_zipcode);
this.setTitle("우편번호 검색");
this.setSize(430, 400);
this.setVisible(true);
}
@Override
public void mousePressed(MouseEvent e) {
if(e.getClickCount() == 2) // 더블클릭 한거야?
{
int index = jtb_zipcode.getSelectedRowCount();
int zipcode =(int) dtm_zipcode.getValueAt(index, 0);
String adress = (String) dtm_zipcode.getValueAt(index, 1);
System.out.println(zipcode + "," + adress);
/*
* 부모창인 회원가입 창에서 우편번호아 주소자리(MemberShipView)에 조회된 결과를 자동으로 출력해줌
* 부모(MemberShipView)의 주소 번지가 필요하다.
*/
}
}
요구사항 ) 부모창인 회원가입 창에서 우편번호와 주소자리(MemberShipView)에 조회된 결과를 자동으로 출력해줌
힌트1 ) ValueOf메소드를 사용하면 된다.
힌트2 ) MemberShipShipView를 인스턴스화 하면 그 때 즉시 전역변수의 ZipCodeView 객체가 생성되고 이 때 파라미터 자리에 this는 앞에 인스턴스화를 통해 현재 로딩중인 그 원본이므로 복사본이 아니다.
memberShipView.jtf_zipcode.setText(String.valueOf(zipcode));
memberShipView.jtf_address.setText(String.valueOf(address));
package com.chat;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import com.step6.ZipCodeView;
public class MemberShipView extends JDialog implements ActionListener{
//선언부
JPanel jp_center = new JPanel();
JLabel jlb_id = new JLabel("아이디");
JTextField jtf_id = new JTextField(10);
JLabel jlb_pw = new JLabel("패스워드");
JTextField jtf_pw = new JTextField(10);
JLabel jlb_nickName = new JLabel("대화명");
JTextField jtf_nickName = new JTextField(20);
JLabel jlb_name = new JLabel("성명");
JTextField jtf_name = new JTextField(30);
JLabel jlb_gender = new JLabel("성별");
String[] genderList = {"남자","여자"};
JComboBox jcb_gender = new JComboBox(genderList);
JLabel jlb_zipcode = new JLabel("우편번호");
public JTextField jtf_zipcode = new JTextField(6);
JLabel jlb_address = new JLabel("주소");
public JTextField jtf_address = new JTextField(100);
JButton jbtn_zipcode = new JButton("우편번호찾기");
JScrollPane jsp = null;
JPanel jp_south = new JPanel();
JButton jbtn_ins = new JButton("등록");
JButton jbtn_close = new JButton("닫기");
//insert here
//우편번호 검색기 클래스를 전역변수 자리에서 생성한다 - MemberShipView가 생성될때 그때 생성이 됨
//파라미터 자리에 this를 쓸 수 있는건 이 어플리케이션을 실행했을때 비로서 객체가 로딩됨
ZipCodeView zcView = new ZipCodeView(this);//this는 현재 로딩중인 원본이다.
//생성자
public MemberShipView(){
//initDisplay();
}
//화면처리부
public void initDisplay() {
jbtn_zipcode.addActionListener(this);
jp_center.setLayout(null);
jlb_id.setBounds(20, 20, 100, 20);
jtf_id.setBounds(120, 20, 120, 20);
jlb_pw.setBounds(20, 45, 100, 20);
jtf_pw.setBounds(120, 45, 120, 20);
jlb_nickName.setBounds(20, 70, 100, 20);
jtf_nickName.setBounds(120, 70, 150, 20);
jlb_name.setBounds(20, 95, 100, 20);
jtf_name.setBounds(120, 95, 150, 20);
jlb_gender.setBounds(20, 120, 100, 20);
jcb_gender.setBounds(120, 120, 150, 20);
jcb_gender.setFont(new Font("굴림",1,14));
jlb_zipcode.setBounds(20, 145, 100, 20);
jtf_zipcode.setBounds(120, 145, 100, 20);
jbtn_zipcode.setBounds(230, 145, 120, 20);
jlb_address.setBounds(20, 170, 100, 20);
jtf_address.setBounds(120, 170, 250, 20);
jp_center.add(jlb_id);
jp_center.add(jtf_id);
jp_center.add(jlb_pw);
jp_center.add(jtf_pw);
jp_center.add(jlb_nickName);
jp_center.add(jtf_nickName);
jp_center.add(jlb_name);
jp_center.add(jtf_name);
jp_center.add(jlb_gender);
jp_center.add(jcb_gender);
jp_center.add(jlb_zipcode);
jp_center.add(jtf_zipcode);
jp_center.add(jbtn_zipcode);
jp_center.add(jlb_address);
jp_center.add(jtf_address);
jp_south.setLayout(new FlowLayout(FlowLayout.RIGHT));
jp_south.add(jbtn_ins);
jp_south.add(jbtn_close);
this.add("South",jp_south);
jsp = new JScrollPane(jp_center);
this.add("Center",jsp);
this.setTitle("회원가입");
this.setSize(400, 500);
this.setVisible(true);
}
public static void main(String[] args) {
MemberShipView ms = new MemberShipView();// 전역변수자리에 인스턴스화 한 객체들이 비로서 이때 로딩이 됨
ms.initDisplay();
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("action");
Object obj = e.getSource();
if(obj == jbtn_zipcode) {
//insert here 우편번호 검색기
zcView.initDisplay();
}
}
}
package com.chat;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import com.util.DBConnectionMgr;
public class ZipCodeView extends JFrame implements ActionListener, FocusListener, MouseListener {
//선언부
String zdo = null;
//물리적으로 떨어져 있는 db서버와 연결통로 만들기
Connection con = null;
//위에서 연결되면 쿼리문을 전달할 전령의 역할을 하는 인터페이스 객체 생성하기
PreparedStatement pstmt = null;
//조회된 결과를 화면에 처리해야 하므로 오라클에 커서를 조작하기 위해 ResultSet추가
ResultSet rs = null;
//JFrame 은 기본적으로 BorderLayout이다(동,서,남,북,중앙 배치)
//디폴트는 FlowLayout, -> BorderLayout -> setLayout
//jp_north.add("Center", jtf_dong)
//jp_north.add("West",jbtn_search)
JPanel jp_north = new JPanel();//Div태그 span생각
//insert here
String zdos[] = {"전체","서울","경기","강원"};
String zdos2[] = {"전체","부산","전남","대구"};
Vector<String> vzdos = new Vector<>();//vzdos.size()==>0
JComboBox jcb_zdo = new JComboBox(zdos);//West
JComboBox jcb_zdo2 = null;//West
JTextField jtf_search = new JTextField("동이름을 입력하세요.");//Center
JButton jbtn_search = new JButton("조회");//East
String cols[] = {"우편번호","주소"};
String data[][] = new String[0][2];
DefaultTableModel dtm_zipcode = new DefaultTableModel(data,cols);
JTable jtb_zipcode = new JTable(dtm_zipcode);
JTableHeader jth = jtb_zipcode.getTableHeader();
JScrollPane jsp_zipcode = new JScrollPane(jtb_zipcode
,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED
,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
String zdos3[] = null;
DBConnectionMgr dbMgr = null;//싱글톤 패턴으로 관리한다. 복제본을 만들지 않는다. 절대로....
MemberShipView memberShipView = null;//null이 뭔가를 가리키는 시점은 ZipCodeVIew생성자가 호출될때
//생성자
public ZipCodeView() {
}
public ZipCodeView(MemberShipView memberShipView) {
this.memberShipView = memberShipView;// 재정의, 치환하기
}
//화면처리부
public void initDisplay() {
jtb_zipcode.requestFocus();
jtf_search.addFocusListener(this);
jtb_zipcode.addMouseListener(this);
jbtn_search.addActionListener(this);
jtf_search.addActionListener(this);
//북쪽 배치하는 속지를 FlowLayout-> 동서남북중앙 - UI솔루션
jp_north.setLayout(new BorderLayout());
/* */
//vzdos.copyInto(zdos2);
for(int x=0;x<zdos2.length;x++) {
vzdos.add(zdos2[x]);
}
for(String s:vzdos) {
System.out.println("s===>"+s);
}
//jcb_zdo2 = new JComboBox(zdos3);//West
//jp_north.add("East",jcb_zdo2);
jp_north.add("Center",jtf_search);
jp_north.add("East",jbtn_search);
this.add("North",jp_north);
this.add("Center",jsp_zipcode);
this.setTitle("우편번호 검색");
this.setSize(430, 400);
this.setVisible(true);
}
//메인메소드
public static void main(String[] args) {
ZipCodeView zcs = new ZipCodeView();
zcs.initDisplay();//화면이 먼저 열리도록 하고 오라클서버를 나중에 연결하자
//zcs.refreshData("가산");
}
/******************************************************
* 사용자로부터 동이름을 입력 받아서 조건 검색을 구현하기
* @param dong - 동이름
* sql문
SELECT zipcode, address - 두 개의 컬럼이 DTO or Map - > List담아라 - > row레벨을 담는다
FROM zipcode_t
WHERE dong LIKE ?||'%';
* 화면이 존재하는 경우 DB서버에서 가져온 정보를 가지고 후처리를 해야 함
* return타입을 void로 했으니까 이 메소드에서 화면처리까지 진행함
* UI - react - 화면과 로직(Model계층-UI+데이터셋만난다) 분리 -
* 데이터셋에 데이터를 추가하는 것은 row단위(1차배열, Vector)로 처리된다
* DefaultTableModel -> addRow(Objectr[]), addRow(Vector)
* ClassNotFoundException - > ojdbc6.jar -> build path
* NullPointerException발동 -> con.prepareStatement("SELECT문"); - con이 널이다. ip주소, port:1521, 1522, `1523
* scott/tiger - 인증실패관련메시지
* sid가 이미 설치된 컴터 orcl
* SQLException은 sql문의 오류이다. 자바의 문제가 아님 - 토드에서 단위테스트 해볼것.
******************************************************/
public void refreshData(String dong) {
List<Map<String,Object>> list = new ArrayList<>();
StringBuilder sql = new StringBuilder();
sql.append("SELECT zipcode, address ");
sql.append(" FROM zipcode_t ");
sql.append(" WHERE dong LIKE ?||'%'");
dbMgr = DBConnectionMgr.getInstance();
try {
con = dbMgr.getConnection();//물리적으로 떨어져 있는 서버와 연결통로 확보
pstmt = con.prepareStatement(sql.toString());//쿼리문을 먼저 스캔하여 있을 지 모르는 변수의 자리를 치환할것.
pstmt.setString(1, dong);//dong, 당산, 가산, 공덕
rs = pstmt.executeQuery();
Map<String,Object> rmap = null;
while(rs.next()) {
rmap = new HashMap<>();
rmap.put("zipcode", rs.getInt("zipcode"));
rmap.put("address", rs.getString("address"));
list.add(rmap);
}
System.out.println(list);//주소번지가 33번 출력될것이다. - 단위테스트 하자
//메소드 설계가 리턴타입이 빠져 있으므로 화면 처리까지 여기서 해야 함.
for(int i=0;i<list.size();i++) {//33번 반복됨 - row수
Map<String, Object> map = list.get(i);
Vector<Object> v = new Vector<>();
v.add(0,map.get("zipcode"));
v.add(1,map.get("address"));
dtm_zipcode.addRow(v);
}
} catch (SQLException se) {
System.out.println(sql.toString());//출력된 쿼리문을 갈무리해서 토드에서 확인해 볼것.
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if(obj == jbtn_search || obj == jtf_search) {
System.out.println(jtf_search.getText());//당산
String dong = jtf_search.getText();
refreshData(dong);
}
}
@Override
public void focusGained(FocusEvent e) {
Object obj = e.getSource();
if(obj == jtf_search) {
jtf_search.setText("");
}
}
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
if(e.getClickCount()==2) {//더블클릭한거야?
//화면 테이블에서 더블클릭했을 때 선택된 로우의 index값을 반환해줌
int index = jtb_zipcode.getSelectedRow();//1.8부터 오토박싱을 통해서 int와 Wrapper클래스는 자동으로 형전환
int zipcode = (int)dtm_zipcode.getValueAt(index, 0);//선택된 로우의 우편번호가 담김
String address = (String)dtm_zipcode.getValueAt(index, 1);
System.out.println(zipcode +", "+ address);//
//insert here - 부모창인 회원가입 창에서 우편번호 와 주소자리(MemberShipView)에 조회된 결과를 자동으로 출력해줌
//부모(MemberShipView)의 주소번지가 필요하다.
//valueOf메소드의 파라미터자리에 어떤 값이 오든 String 타입으로 형전환해주는 메소드 이다.
//관전 포인트 하나더 - 싱글톤으로 제공되는 메소드 입니다.
//MemberShipView를 인스턴스화 하면 그 때 즉시 전역변수의 ZipCodeView객체가 생성되고 이때 파라미터 자리에 this는
//앞에 인스턴스화를 통해 현재 로딩 중인 그 원본이므로 복사본이 아니다.
memberShipView.jtf_zipcode.setText(String.valueOf(zipcode));
memberShipView.jtf_address.setText(String.valueOf(address));
}
}
@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
}
}