일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- List
- html
- deque
- union_find
- NIO
- BFS
- math
- 힙덤프
- 큐
- Calendar
- scanner
- 스프링부트
- map
- Union-find
- sql
- GC로그수집
- CSS
- JPA
- dfs
- date
- javascript
- 스택
- alter
- Java
- string
- spring boot
- set
- 리소스모니터링
- Properties
- priority_queue
- Today
- Total
매일 조금씩
12/10 - GUI(3) : JSpinner, JComboBox, JList, JTable, JTree 본문
12/10 - GUI(3) : JSpinner, JComboBox, JList, JTable, JTree
mezo 2020. 12. 10. 23:23* 보기 좋은 떡이 먹기도 좋다!!
GUI Project
기획 :
1. Architecture(팀장급 회의)
- 객체 모델링
UML
starUML ...
- 데이터 모델링
ERD
eXERD ...
- 디자인 기획(UI/UX)
스토리 보드(Mockup : Wireframe) - sketch
powermockup
1. Container
2. LayoutManager(Null(Absolute) Layout)
3. Widget(Component)
4. 이벤트
1. 마우스 클릭
2. ItemStateChanged
* DAO / TO (객체중심 ) 중요
JCheckBox / JRadioButton
JOptionPane
JProgressBar
JSlider
(데이터를 갖지 않음)
데이터를 포함 할 수 있는 Widget
클래스
M(odel) : 데이터
V(iew) : 디자인
1. JSpinner
JSpinnerEx01.java
model(list, number, date)에 데이터를 넣는다. (object가 됨)
- list - SpinnerListModel
- number - SpinnerNumberModel
- date - SpinnerDateModel
JSpinner는 ui이고 setModel메서드로 SPSpinnerListModel로 데이터를 넣는다.
한글은 한글에 대한 유니코드로 들어간다. ex) "사과" -> "\uC0AC\uACFC" (그냥 코드에 바로 "사과" 넣어도 됨)
1) 데이터 넣기
(1) 이렇게 한번에 써도 되고
spinner.setModel(new SpinnerListModel(new String[] {"\uC0AC\uACFC", "\uB538\uAE30", "\uC218\uBC15", "\uCC38\uC678"}));
(2) 나눠서 써도 된다.
String[] items = new String[] {"사과","딸기","수박","참외"};
SpinnerListModel spinnerListModel = new SpinnerListModel(items);
spinner.setModel(spinnerListModel);
(3) 사용자 정의 클래스 사용해도 된다. (UserSpinnerListModel.java)
새로운 클래스 만들때 spinnerListModel을 superclass로 추가 필수
다음과 같이 클래스를 따로 정의하고
import javax.swing.SpinnerListModel;
public class UserSpinnerListModel extends SpinnerListModel {
String[] items = new String[] {"사과","딸기","수박","참외"};
public SpinnerListModel getValues(){
SpinnerListModel spinnerListModel = new SpinnerListModel(items);
return spinnerListModel;
}
}
아래와 같이 getValues()로 호출한다.
spinner.setModel(new UserSpinnerListModel().getValues());
2) 값 가져오기
버튼으로 값을 가져올때 원래 하던대로
String value = spinner.getValue();
이렇게 하면 object가 들어가서 에러가 난다.
따라서 아래처럼 해줘야한다.
String value = (String)spinner.getValue();
3) 값이 변할 때마다 값 가져오기
버튼 필요X
stateChange사용하면된다.
spinner.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
String value = (String)spinner.getValue();
System.out.println(value);
}
});
버튼보다 이걸더 많이 쓴다.
2. JComboBox
JComboBoxEx01.java
model에 데이터를 넣는다. (object가 됨)
1) 데이터 넣기 / 가져오기
selectedIndex
0번이 첫번째 아이템이 된다.
이걸로 선택된 아이템을 알수 있다.
아무것도 선택되지 않았으면 -1이다.
(1) 버튼을 사용해서 값 넣고 가져오기
selectedIndex를 가져온 후에 가져오는게 좋다.
System.out.println(comboBox.getSelectedIndex());
System.out.println((String)comboBox.getSelectedItem());
(2) 사용자 정의 함수 사용 (CustomComboBoxModel.java)
새로운 클래스 만들때 DefaultComboBoxModel를 superclass로 추가 필수
import javax.swing.DefaultComboBoxModel;
public class CustomComboBoxModel extends DefaultComboBoxModel<Object> {
private String[] datas1 = new String[] {"사과","딸기","수박","참외"};
// callback - combobox 자동으로 불리워지는 메서드
public int getSize() {
System.out.println("getSize() 호출");
return datas1.length;
}
public Object getElement(int index) {
System.out.println("getElementAt() 호출");
return datas1[index];
}
}
comboBox.setModel(new CustomComboBoxModel());
버튼 사용 말고 콤보박스내에서 이벤트를 주는 것도 가능하다.
콤보박스에서 아이템을 선택했을 때 '선택됨'이 콘솔창에 출력되게 하기
itemStateChange 사용
근데 여기서 원래대로 아래처럼 코드를 작성하면 '선택됨'이 두개씩 출력된다.
comboBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
System.out.println("선택됨");
}
});
하나씩 출력되게 하려면
comboBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
System.out.println("선택됨");
}
}
});
위처럼 if 문을 추가해줘야한다. 이 if문은 거의 외우다시피 해야한다.
3. JList
selection multi_selected복수선택이 가능 (ctrl키 사용해야함)
selection에서 single_selected로 설정 변경 해주는게 낫다.
데이터가 리스트 화면 크기보다 더 많으면 잘려서 안나옴 (scrollPane 해줘야함)
scrollPane은 horizontalScrollBarPolicy에서 설정을 정해줄수 있다.
(1) 자동으로 되어 있던 방식
list.setModel(new AbstractListModel() {
String[] values = new String[] {"사과", "딸기", "수박", "참외"};
public int getSize() {
return values.length;
}
public Object getElementAt(int index) {
return values[index];
}
});
(2) 사용자 정의 함수 (CustomListModel.java)
AbstractListModel를 superclass로 추가 필수
import javax.swing.AbstractListModel;
public class CustomListModel extends AbstractListModel<String> {
private String[] values = new String[] {"사과","딸기","수박","참외"};
@Override
public String getElementAt(int index) {
return values[index];
}
@Override
public int getSize() {
return values.length;
}
}
list.setModel(new CustomListModel());
실습1) 동이름입력받아서 주소 출력
입력받은 동에 해당하는 주소들을 ArrayList<String>에 담아서 객체로 만드는 것이 포인트!
(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 javax.swing.border.TitledBorder;
import model1.CustomListModel;
import javax.swing.UIManager;
import java.awt.Color;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;
public class ZipcodeSearchUI05 extends JFrame {
private JPanel contentPane;
private JTextField textField;
private JList list;
private JTextField textField1;
private JTextField textField2;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ZipcodeSearchUI05 frame = new ZipcodeSearchUI05();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public ZipcodeSearchUI05() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 650, 613);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JPanel panel = new JPanel();
panel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "\uC6B0\uD3B8\uBC88\uD638\uAC80\uC0C9\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
panel.setBounds(6, 21, 616, 73);
contentPane.add(panel);
panel.setLayout(null);
JLabel lbl = new JLabel("동이름");
lbl.setBounds(12, 41, 57, 15);
panel.add(lbl);
textField = new JTextField();
textField.setBounds(67, 38, 428, 21);
panel.add(textField);
textField.setColumns(10);
JButton btn = new JButton("검색");
btn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// 초기화 작업
try {
String strDong = textField.getText();
if(list != null) {
list.setModel( new CustomListModel(strDong));
}
} catch (ClassNotFoundException e1) {
System.out.println("[에러]" + e1.getMessage());
} catch (SQLException e1) {
System.out.println("[에러]" + e1.getMessage());
} catch (NullPointerException e1) {
System.out.println("[에러]" + e1.getMessage());
}
}
});
btn.setBounds(507, 37, 97, 23);
panel.add(btn);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setBounds(10, 111, 612, 380);
contentPane.add(scrollPane);
list = new JList();
list.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
textField1.setText((String)list.getSelectedValue());
}
});
scrollPane.setViewportView(list);
textField1 = new JTextField();
textField1.setEditable(false);
textField1.setText("기본주소");
textField1.setBounds(12, 512, 610, 21);
contentPane.add(textField1);
textField1.setColumns(10);
textField2 = new JTextField();
textField2.setText("상세주소");
textField2.setBounds(12, 543, 610, 21);
contentPane.add(textField2);
textField2.setColumns(10);
}
}
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;
import javax.swing.AbstractListModel;
public class CustomListModel extends AbstractListModel<String> {
private ArrayList<String> values = new ArrayList<String>();
private Connection conn = null;
public CustomListModel() throws ClassNotFoundException, SQLException{
}
public CustomListModel(String strDong) throws ClassNotFoundException, SQLException, NullPointerException{
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);
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");
values.add(String.format("[%s] %s %s %s %s %s\n", zipcode, sido , gugun, dong, ri, bunji));
}
}
@Override
public String getElementAt(int index) {
// TODO Auto-generated method stub
return values.get(index);
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return values.size();
}
}
(2) DAO / TO 로 구현하기
- 버튼클릭했을 때 메서드 *(1) 과 동일
btn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// 초기화 작업
try {
if(list != null) {
String strDong = textField.getText();
list.setModel( new ZipcodeListModel2(strDong));
}
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
- 리스트에서 주소 클릭했을 때 [기본 주소] 대신 클릭한 주소가 나오게 하기 *(1) 과 동일
list.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
textField1.setText((String)list.getSelectedValue());
}
});
- 주소 리스트 모델링
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;
import javax.swing.AbstractListModel;
public class ZipcodeListModel2 extends AbstractListModel<String> {
private ArrayList<ZipcodeTO> values;
public ZipcodeListModel2() {
}
public ZipcodeListModel2(String strDong) throws ClassNotFoundException, SQLException{
ZipcodeDAO dao = new ZipcodeDAO();
values = dao.searchZipcode(strDong);
}
@Override
public String getElementAt(int index) {
ZipcodeTO value = values.get(index);
String address = String.format("[%s] %s %s %s %s %s\n", value.getZipcode(), value.getSido(), value.getGugun(),
value.getDong(), value.getRi(), value.getBunji());
return address;
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return values.size();
}
}
- 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;
}
}
(3) 추가로 2자 이상 입력으로 조건걸기
if(list != null) {
String strDong = textField.getText();
if(strDong.length() < 2) {
JOptionPane.showMessageDialog(ZipcodeSearchUI05.this, "2자 이상 입력해주세요", "경고", JOptionPane.WARNING_MESSAGE);
}else {
list.setModel( new ZipcodeListModel2(strDong));
}
}
4. JTable
가장 복잡한 것 중 하나!
JTableEx01.java
model 사용
enable은 false 시켜서 read only 만들어도된다.
사용자 정의 함수로 빼내기 (CustomTableModel.java)
extends AbstractTableModel 해줘야함
(1) 일반 사용자 정의 함수 사용
import javax.swing.table.AbstractTableModel;
public class CustomTableModel extends AbstractTableModel {
// 2차원 배열 / ArrayList<ArrayList> / ArrayList<TO>
private String[][] datas = new String[][] {
{"11","12","13","14"},
{"21","22","23","24"},
{"31","32","33","34"},
};
@Override
public int getColumnCount() {
// 컬럼의 갯수 / 모두 대칭이므로 인덱스 0 걸로 불러와도됨
return datas[0].length;
}
@Override
public int getRowCount() {
// 데이터의 갯수
return datas.length;
}
@Override
public Object getValueAt(int rosIndex, int columnIndex) {
return datas[rosIndex][columnIndex];
}
}
table.setModel(new CustomTableModel());
(2) ArrayList<ArrayList> 사용
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
public class CustomTableModel extends AbstractTableModel {
// 2차원 배열 / ArrayList<ArrayList> / ArrayList<TO>
private String[][] datas = new String[][] {
{"11","12","13","14"},
{"21","22","23","24"},
{"31","32","33","34"},
};
ArrayList<ArrayList> datas2 = new ArrayList<ArrayList>();
public CustomTableModel() {
ArrayList<String> data1 = new ArrayList<String>();
data1.add("11"); data1.add("12"); data1.add("13"); data1.add("14");
ArrayList<String> data2 = new ArrayList<String>();
data2.add("21"); data2.add("22"); data2.add("23"); data2.add("24");
ArrayList<String> data3 = new ArrayList<String>();
data3.add("31"); data3.add("32"); data3.add("33"); data3.add("34");
datas2.add(data1);
datas2.add(data2);
datas2.add(data3);
}
@Override
public int getColumnCount() {
// 컬럼의 갯수 / 모두 대칭이므로 인덱스 0 걸로 불러와도됨
return datas2.get(0).size();
}
@Override
public int getRowCount() {
// 데이터의 갯수
return datas2.size();
}
@Override
public Object getValueAt(int rosIndex, int columnIndex) {
return datas2.get(rosIndex).get(columnIndex);
}
}
(2) ArrayList<TableTO> 사용
public class TableTO {
private String col1;
private String col2;
private String col3;
private String col4;
public TableTO(String col1, String col2, String col3, String col4) {
this.col1 = col1;
this.col2 = col2;
this.col3 = col3;
this.col4 = col4;
}
public String getCol1() {
return col1;
}
public String getCol2() {
return col2;
}
public String getCol3() {
return col3;
}
public String getCol4() {
return col4;
}
}
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
public class CustomTableModel2 extends AbstractTableModel {
private ArrayList<TableTO> datas;
//ArrayList<ArrayList> datas2 = new ArrayList<ArrayList>();
public CustomTableModel2() {
TableTO to1 = new TableTO("11","12","13","14");
TableTO to2 = new TableTO("21","22","23","24");
TableTO to3 = new TableTO("31","32","33","34");
datas = new ArrayList<TableTO>();
datas.add(to1);
datas.add(to2);
datas.add(to3);
}
@Override
public int getColumnCount() {
// 컬럼의 갯수 / 안에서 가져오기 어려워서 그냥 정해줌
return 4;
}
@Override
public int getRowCount() {
// 데이터의 갯수
return datas.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
String result = "";
TableTO to = datas.get(rowIndex);
switch(columnIndex) {
case 0 :
result = to.getCol1();
break;
case 1 :
result = to.getCol2();
break;
case 2 :
result = to.getCol3();
break;
case 3 :
result = to.getCol4();
break;
default :
}
return result;
}
}
table.setModel(new CustomTableModel2());
컬럼명이 날아가므로 별도의 컬럼명을 String 으로 해줘야한다.
아래 코드를 위 코드 중에서 CustomTableModel2 클래스에 추가하면 된다.
private String[] columnNames = {"컬럼1", "컬럼2", "컬럼3", "컬럼4"};
// 컬럼 이름 넣기
@Override
public String getColumnName(int column) {
return columnNames[column];
}
5. JTree
read only 가 많다.
model 에서 tab 키 치면서 만들고 수정한다. (코드에서 바로 수정하면 안나옴)
tree.setModel(new DefaultTreeModel(
new DefaultMutableTreeNode("JTree") {
{
DefaultMutableTreeNode node_1;
node_1 = new DefaultMutableTreeNode("과일");
node_1.add(new DefaultMutableTreeNode("사과"));
node_1.add(new DefaultMutableTreeNode("딸기"));
node_1.add(new DefaultMutableTreeNode("수박"));
node_1.add(new DefaultMutableTreeNode("참외"));
add(node_1);
node_1 = new DefaultMutableTreeNode("sports");
node_1.add(new DefaultMutableTreeNode("basketball"));
node_1.add(new DefaultMutableTreeNode("soccer"));
node_1.add(new DefaultMutableTreeNode("football"));
node_1.add(new DefaultMutableTreeNode("hockey"));
add(node_1);
}
}
));
이렇게 만들어지고
DefaultMutableTreeNode root = new DefaultMutableTreeNode("JTREE");
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("과일");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("야채");
DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("고기");
DefaultMutableTreeNode child11 = new DefaultMutableTreeNode("수박");
DefaultMutableTreeNode child12 = new DefaultMutableTreeNode("참외");
DefaultMutableTreeNode child21 = new DefaultMutableTreeNode("오이");
DefaultMutableTreeNode child22 = new DefaultMutableTreeNode("당근");
DefaultMutableTreeNode child31 = new DefaultMutableTreeNode("소고기");
DefaultMutableTreeNode child32 = new DefaultMutableTreeNode("돼지고기");
node1.add(child11);
node1.add(child12);
node2.add(child21);
node2.add(child22);
node3.add(child31);
node3.add(child32);
root.add(node1);
root.add(node2);
root.add(node3);
tree.setModel(new DefaultTreeModel(root));
이렇게도 만들어진다.
※ 응용 문제
주소 검색에 JTable형태로 출력되게 만들기
(1) 내가 한거 (DAO/DTO)
- '검색' 버튼을 누르면 주소테이블이 쫘라락
btn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// 초기화 작업
try {
if(table != null) {
String strDong = textField.getText();
if(strDong.length() < 2) {
JOptionPane.showMessageDialog(ZipcodeSearchUI06.this, "2자 이상 입력해주세요", "경고", JOptionPane.WARNING_MESSAGE);
}else {
table.setModel( new ZipcodeTableModel(strDong));
}
}
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
- 테이블중 하나를 선택하면 [기본 주소] 에 값 출력
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
textField1.setText((String)table.getValueAt(table.getSelectedRow(), table.getSelectedColumn()));
}
});
- 값을 객체로 모델링
package model1;
import java.io.ObjectInputStream.GetField;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
public class ZipcodeTableModel extends AbstractTableModel {
private ArrayList<ZipcodeTO> values;
private String[] columnNames = {"우편번호", "시도", "구군", "동", "리", "번지"};
//ArrayList<ArrayList> datas2 = new ArrayList<ArrayList>();
public ZipcodeTableModel() {
}
public ZipcodeTableModel(String strDong) throws ClassNotFoundException, SQLException{
ZipcodeDAO dao = new ZipcodeDAO();
values = dao.searchZipcode(strDong);
}
// 컬럼 이름 넣기
@Override
public String getColumnName(int column) {
return columnNames[column];
}
@Override
public int getColumnCount() {
// 컬럼의 갯수 / 안에서 가져오기 어려워서 그냥 정해줌
return 6;
}
@Override
public int getRowCount() {
// 데이터의 갯수
return values.size();
}
// public Object selectRow(int rowIndex) {
// String result ="";
// ZipcodeTO to = values.get(rowIndex);
// result = String.format("[%s] %s %s %s %s %s", to.getZipcode(), to.getSido(),
// to.getGugun(), to.getDong(), to.getRi(), to.getBunji());
// return result;
// }
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
String result = "";
ZipcodeTO to = values.get(rowIndex);
switch(columnIndex) {
case 0 :
result = to.getZipcode();
break;
case 1 :
result = to.getSido();
break;
case 2 :
result = to.getGugun();
break;
case 3 :
result = to.getDong();
break;
case 4 :
result = to.getRi();
break;
case 5 :
result = to.getBunji();
break;
default :
}
return result;
}
}
- 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 와 getter
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;
}
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;
}
}
'빅데이터 플랫폼 구축을 위한 자바 개발자 양성과정' 카테고리의 다른 글
12/14 - Java로 메일 발송 (텍스트, html, 이미지, 첨부파일) (0) | 2020.12.15 |
---|---|
12/11 - GUI(4) : JDialog, JMenu, Layout, Event (0) | 2020.12.13 |
12/09 - GUI(2) : JCheckBox, JRadioButton, JOptionPane, JProgreeBar, JSlider (0) | 2020.12.10 |
12/08 - GUI(1) : Swing, Window Builder (JLabel, JButton, JTextField, JTextArea) (0) | 2020.12.10 |
12/07 - JDBC(3) : 항상 대기중인 서버, 클라이언트, DB 연결 구동과 병렬 스레드, 채팅 구현 (0) | 2020.12.10 |