1. 데이터베이스 - ERD - SQL
// 시, 도 목록
select distinct sido from zipcode;
// 서울시의 구, 군 목록
select distinct gugun from zipcode where sido = '서울';
// 서울시 중랑구의 동 목록
select distinct dong from zipcode where sido = '서울' and gugun = '중랑구';
// 서울시 중랑구 중화2동의 zipcode, ri, bunji 목록
select zipcode, ri, bunji from zipcode where sido = '서울' and gugun = '중랑구' and dong = '중화2동';
2. UML
Class Diagram - 클래스/메서드/필드
ZipcodeSearchUI
SidoComboBoxModel
GugunComboBoxModel => ZipcodeTO => ZipcodeDAO
DongComboBoxModel setxxx ArrayList<ZipcodeTO>listSido()
getSize() getxxx ArrayList<ZipcodeTO>listGugun(String strSido)
getElementAt() ArrayList<ZipcodeTO>listDong(String strSido, String strGugun)
ArrayList<ZipcodeTO>listAddress(String strSido, String strGugun, String strDong)
Sequence Diagram - 메서드 호출
Use Case Diagram - 기능
SidoComboBoxModel
public class SidoComboBoxModel extends DefaultComboBoxModel<String> {
private ArrayList<ZipcodeTO> sidos;
public SidoComboBoxModel() {
// TODO Auto-generated constructor stub
/*
sidos = new ArrayList<>();
ZipcodeTO to = new ZipcodeTO();
to.setSido("시도");
sidos.add(to);
*/
ZipcodeDAO dao = new ZipcodeDAO();
sidos = dao.listSido();
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return sidos.size();
}
@Override
public String getElementAt(int index) {
// TODO Auto-generated method stub
ZipcodeTO to = sidos.get(index);
return to.getSido();
}
}
GugunComboBoxModel
public class GugunComboBoxModel extends DefaultComboBoxModel<String> {
private ArrayList<ZipcodeTO> guguns;
public GugunComboBoxModel() {
// TODO Auto-generated constructor stub
guguns = new ArrayList<>();
ZipcodeTO to = new ZipcodeTO();
to.setGugun("구군");
guguns.add(to);
}
public GugunComboBoxModel(String strSido) {
ZipcodeDAO dao = new ZipcodeDAO();
guguns = dao.listGugun(strSido);
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return guguns.size();
}
@Override
public String getElementAt(int index) {
// TODO Auto-generated method stub
ZipcodeTO to = guguns.get(index);
return to.getGugun();
}
}
DongComboBoxModel
public class DongComboBoxModel extends DefaultComboBoxModel<String> {
private ArrayList<ZipcodeTO> dongs;
public DongComboBoxModel() {
// TODO Auto-generated constructor stub
dongs = new ArrayList<>();
ZipcodeTO to = new ZipcodeTO();
to.setDong("동");
dongs.add(to);
}
public DongComboBoxModel(String strSido, String strGugun) {
ZipcodeDAO dao = new ZipcodeDAO();
dongs = dao.listDong(strSido, strGugun);
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return dongs.size();
}
@Override
public String getElementAt(int index) {
// TODO Auto-generated method stub
ZipcodeTO to = dongs.get(index);
return to.getDong();
}
}
model
TO
public class ZipcodeTO {
private String zipcode;
private String sido;
private String gugun;
private String dong;
private String ri;
private String bunji;
getxxx ...
setxxx ...
}
DAO
public class ZipcodeDAO {
private Connection conn;
// 데이터베이스 연결
public ZipcodeDAO() {
// TODO Auto-generated constructor stub
String url = "jdbc:mariadb://localhost:3306/project";
String user = "project";
String password = "1234";
try {
Class.forName("org.mariadb.jdbc.Driver");
this.conn = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("[에러] : " + e.getMessage());
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("[에러] : " + e.getMessage());
}
}
public ArrayList<ZipcodeTO>listSido() {
PreparedStatement pstmt = null;
ResultSet rs = null;
ArrayList<ZipcodeTO> sidos = new ArrayList<>();
try {
String sql = "select distinct sido from zipcode";
pstmt = this.conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
ZipcodeTO to = new ZipcodeTO();
to.setSido(rs.getString("sido"));
sidos.add(to);
}
} catch(SQLException e) {
// TODO Auto-generated catch block
System.out.println("[에러] : " + e.getMessage());
} finally {
if (conn != null) try {conn.close();} catch (SQLException e) {}
if (pstmt != null) try {pstmt.close();} catch (SQLException e) {}
if (rs != null) try {rs.close();} catch(SQLException e) {}
}
return sidos;
}
public ArrayList<ZipcodeTO>listGugun(String strSido) {
PreparedStatement pstmt = null;
ResultSet rs = null;
ArrayList<ZipcodeTO> guguns = new ArrayList<>();
try {
String sql = "select distinct gugun from zipcode where sido = ?";
pstmt = this.conn.prepareStatement(sql);
pstmt.setString(1, strSido);
rs = pstmt.executeQuery();
while(rs.next()) {
ZipcodeTO to = new ZipcodeTO();
to.setGugun(rs.getString("gugun"));
guguns.add(to);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("[에러] : " + e.getMessage());
} finally {
if (conn != null) try {conn.close();} catch (SQLException e) {}
if (pstmt != null) try {pstmt.close();} catch (SQLException e) {}
if (rs != null) try {rs.close();} catch(SQLException e) {}
}
return guguns;
}
public ArrayList<ZipcodeTO>listDong(String strSido, String strGugun) {
PreparedStatement pstmt = null;
ResultSet rs = null;
ArrayList<ZipcodeTO> dongs = new ArrayList<>();
try {
String sql = "select distinct dong from zipcode where sido = ? and gugun = ?";
pstmt = this.conn.prepareStatement(sql);
pstmt.setString(1, strSido);
pstmt.setString(2, strGugun);
rs = pstmt.executeQuery();
while(rs.next()) {
ZipcodeTO to = new ZipcodeTO();
to.setDong(rs.getString("dong"));
dongs.add(to);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("[에러] : " + e.getMessage());
} finally {
if (conn != null) try {conn.close();} catch (SQLException e) {}
if (pstmt != null) try {pstmt.close();} catch (SQLException e) {}
if (rs != null) try {rs.close();} catch(SQLException e) {}
}
return dongs;
}
public ArrayList<ZipcodeTO>listAddress(String strSido, String strGugun, String strDong) {
PreparedStatement pstmt = null;
ResultSet rs = null;
ArrayList<ZipcodeTO> address = new ArrayList<>();
try {
String sql = "select zipcode, ri, bunji from zipcode where sido = ? and gugun = ? and dong = ?";
pstmt = this.conn.prepareStatement(sql);
pstmt.setString(1, strSido);
pstmt.setString(2, strGugun);
pstmt.setString(3, strDong);
rs = pstmt.executeQuery();
while(rs.next()) {
ZipcodeTO to = new ZipcodeTO();
to.setZipcode(rs.getString("zipcode"));
to.setRi(rs.getString("ri"));
to.setBunji(rs.getString("bunji"));
address.add(to);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("[에러] : " + e.getMessage());
} finally {
if (conn != null) try {conn.close();} catch (SQLException e) {}
if (pstmt != null) try {pstmt.close();} catch (SQLException e) {}
if (rs != null) try {rs.close();} catch(SQLException e) {}
}
return address;
}
}
ZIpcodeSearchUI01
combo1 = new JComboBox();
//combo1.setModel(new DefaultComboBoxModel(new String[] {"시도"}));
combo1.setModel(new DefaultComboBoxModel(new String[] {"시도", "서울", "인천", "경기"}));
combo1.setSelectedIndex(0);
combo1.addItemListener( new ItemListener() {
public void itemStateChanged( ItemEvent e ) {
if( e.getStateChange() == ItemEvent.SELECTED ) {
//System.out.println(combo1.getSelectedIndex());
if(combo2 != null) {
combo2.setModel(new GugunComboBoxModel((String)combo1.getSelectedItem()));
combo2.setSelectedIndex(0);
}
}
}
} );
combo1.setBounds( 21, 20, 160, 21 );
panel.add( combo1 );
combo2 = new JComboBox();
//combo2.setModel(new DefaultComboBoxModel(new String[] {"구군"}));
combo2.setModel(new GugunComboBoxModel());
combo2.setSelectedIndex(0);
combo2.addItemListener( new ItemListener() {
public void itemStateChanged( ItemEvent e ) {
if( e.getStateChange() == ItemEvent.SELECTED ) {
if(combo3 != null) {
//combo3.setModel(new DongComboBoxModel((String)combo2.getSelectedItem(), 5));
combo3.setModel(new DongComboBoxModel((String)combo1.getSelectedItem(), (String)combo2.getSelectedItem()));
combo3.setSelectedIndex(0);
}
}
}
} );
combo2.setBounds( 202, 20, 160, 21 );
panel.add( combo2 );
combo3 = new JComboBox();
//combo3.setModel(new DefaultComboBoxModel(new String[] {"동"}));
combo3.setModel(new DongComboBoxModel());
combo3.setSelectedIndex(0);
combo3.addItemListener( new ItemListener() {
public void itemStateChanged( ItemEvent e ) {
if( e.getStateChange() == ItemEvent.SELECTED ) {
textArea.setText("");
String sido = (String)combo1.getSelectedItem();
String gugun = (String)combo2.getSelectedItem();
String dong = (String)combo3.getSelectedItem();
ZipcodeDAO dao = new ZipcodeDAO();
ArrayList<ZipcodeTO> addresses = dao.listAddress(sido, gugun, dong);
for (ZipcodeTO to : addresses) {
String address = String.format("[%s], %s, %s, %s, %s, %s,", to.getZipcode(),
sido, gugun, dong, to.getRi(), to.getBunji());
textArea.append(address + System.lineSeparator());
}
}
}
} );
combo3.setBounds( 383, 20, 160, 21 );
panel.add( combo3 );
NullLayout(Absolute Layout) - 좌표배치
BorderLayout - 한 화면을 5개로 분할해서 배치(동서남북중앙)
: 화면 윤곽을 잡을 때 사용
FlowLayout - 행 또는 열로 배치
: 디폴트가 중앙에 배치
GridLayout - 모눈에 배치
CardLayout - 한 장씩 덮어쓰면서(over write) 배치
getLayout()
setLayout()
JFrame - Border Layout
JPanel - Flow Layout
JButton btn1 = new JButton("New button");
// 1. 이벤트를 연결하는 메서드
// 2. 이벤트가 발생하면 처리되는 이벤트 클래스
// interface / adapter class
// 3. 이벤트가 발생하면 처리 할 이벤트 핸들러
btn1.addMouseListener(new MouseListener() {
// 이벤트 핸들러
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseClicked");
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mousePressed");
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseReleased");
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseEntered");
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseExited");
}
});
btn1.setBounds(12, 10, 97, 23);
contentPane.add(btn1);
textField = new JTextField();
// window builder
textField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(textField.getText());
}
});
// 수동
/*textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println(textField.getText());
}
});*/
textField.setBounds(12, 148, 262, 21);
contentPane.add(textField);
textField.setColumns(10);
JButton btn4 = new JButton("New button");
btn4.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println(textField.getText());
// 클릭한 버튼의 좌표
System.out.println(e.getX());
System.out.println(e.getY());
// 클릭한 횟수 (누적 된다.)
System.out.println(e.getClickCount());
//System.out.println(e.getSource());
// 이벤트가 발생한 버튼을 가져와서 setText()로 바꿈
JButton btn = (JButton)e.getSource();
btn.setText("클릭 됨");
}
});
btn4.setBounds(300, 147, 97, 23);
contentPane.add(btn4);
JButton btn1 = new JButton("1");
btn1.setName("이름1");
btn1.addMouseListener(new UserMouseEvent1());
btn1.setBounds(12, 10, 97, 23);
contentPane.add(btn1);
JButton btn2 = new JButton("2");
btn2.setName("이름2");
btn2.addMouseListener(new UserMouseEvent1());
btn2.setBounds(12, 53, 97, 23);
contentPane.add(btn2);
JButton btn3 = new JButton("3");
btn3.setName("이름3");
btn3.addMouseListener(new UserMouseEvent1());
btn3.setBounds(12, 98, 97, 23);
contentPane.add(btn3);
class UserMouseEvent1 implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseClicked");
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mousePressed");
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseReleased");
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseEntered");
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseExited");
}
}
class UserMouseEvent2 extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("mouseClicked");
System.out.println(((JButton)e.getSource()).getText());
System.out.println(((JButton)e.getSource()).getName());
String name = (((JButton)e.getSource()).getName());
switch(name) {
case "이름1" :
System.out.println("btn1 mouseClicked");
break;
case "이름2" :
System.out.println("btn2 mouseClicked");
break;
case "이름3" :
System.out.println("btn3 mouseClicked");
break;
default :
System.out.println("에러");
}
}
}
+getName() 디자인부분에서 설정하는법