일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- InterruptedException
- 프로그래머스 코테
- 연산자와의 관계
- 멱등성
- 서버 스크립트
- 참조타입
- 오버라이딩
- Java
- 지연로딩
- null/not null
- git 기초
- bufferedInputStream
- 컬렉션 프레임워크
- 메세지 큐
- Shared Lock
- 프로그래머스
- 즉시로딩
- exclusive lock
- foreigen key
- N+1
- select
- SQL
- delete
- 변수와 메서드
- 피연산자
- 오버로딩
- 추상메서드
- 원시타입
- jsoup
- 변수와 상수
- Today
- Total
[JAVA_Back-End]
[JAVA] GUI(4) 본문
< 이전 포스팅 정리 >
UI - 데이터부분
DAO / TO
=> MVC패턴
Model / controller /view
UML - java
클래스 다이어그램
유스케이스 다이어그램
시퀀스 다이어그램
ERD - database
* (압축을 푼)자바 파일에서 UI 편집하기: java파일 선택 (오른쪽 클릭) -> openwith -> windowbuilder Editor로 열기
알고리즘
1. 뽑아낼 데이터베이스 명령어 나타내기
> select distinct sido from zipcode;
> select distinct gugun from zipcode where sido='서울';
> select distinct dong from zipcode where sido='서울' and gugun='강남구';
> select * from zipcode where sido='서울' and gugun='강남구' and dong ='개포1동';
2. 클래스 만들기
<각 정의 파일에 넣을 내용들>
DTO - 데이터베이스 속성과 getter/setter을 정의한 파일
DAO - 생성자, 데이터베이스 연결 시 Connection관련 내용(Driver, url, user, password...)
- ZipcodeTO : 우편번호 테이블 내용
- ZipcodeDAO : 생성자 (DAO를 여러개 만드는게 아닌 생성자를 여러개 만들어서 적용)
listSido()
listGugun(sido)
listDong(sido, gugun)
listAddress(sido,gugun,dong)
3. 박스모델 만들기
SidoComboBoxModel
GugunComboBoxModel
DongComboBoxModel
UI
기획 먼저 진행 후 코드를 짜도록 하자
ZipCodeUI
ZipcodeSearchUI01.java |
import java.awt.Color; import java.awt.EventQueue; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.border.EmptyBorder; import javax.swing.border.EtchedBorder; import javax.swing.border.TitledBorder; public class ZipcodeSearchUI01 extends JFrame { //원본 코드 private JPanel contentPane; private JComboBox combo1; private JComboBox combo2; private JComboBox combo3; 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() { setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setBounds( 100, 100, 600, 800 ); 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\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)) ); panel.setBounds( 6, 15, 566, 55 ); contentPane.add( panel ); panel.setLayout( null ); combo1 = new JComboBox(); combo1.setModel(new DefaultComboBoxModel(new String[] {"시도"})); combo1.setSelectedIndex( 0 ); combo1.addItemListener( new ItemListener() { public void itemStateChanged( ItemEvent e ) { if( e.getStateChange() == ItemEvent.SELECTED ) { } } } ); combo1.setBounds( 21, 20, 160, 21 ); panel.add( combo1 ); combo2 = new JComboBox(); combo2.setModel(new DefaultComboBoxModel(new String[] {"구군"})); combo2.addItemListener( new ItemListener() { public void itemStateChanged( ItemEvent e ) { if( e.getStateChange() == ItemEvent.SELECTED ) { } } } ); combo2.setBounds( 202, 20, 160, 21 ); panel.add( combo2 ); combo3 = new JComboBox(); combo3.setModel(new DefaultComboBoxModel(new String[] {"동"})); combo3.addItemListener( new ItemListener() { public void itemStateChanged( ItemEvent e ) { if( e.getStateChange() == ItemEvent.SELECTED ) { } } } ); combo3.setBounds( 383, 20, 160, 21 ); panel.add( combo3 ); JScrollPane scrollPane = new JScrollPane(); scrollPane.setEnabled(false); scrollPane.setBounds(12, 80, 560, 671); contentPane.add(scrollPane); textArea = new JTextArea(); scrollPane.setViewportView(textArea); } } |
우편번호 검색 전체코드
ZipcodeSearchUI02.java - 메인 UI java코드 |
import java.awt.Color;
public class ZipcodeSearchUI02 extends JFrame { private JPanel contentPane; private JComboBox combo1; private JComboBox combo2; private JComboBox combo3; 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() { setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setBounds( 100, 100, 600, 800 ); 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\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)) ); panel.setBounds( 6, 15, 566, 55 ); contentPane.add( panel ); panel.setLayout( null ); combo1 = new JComboBox(); combo1.setModel(new SidoComboBoxModel()); combo1.setSelectedIndex( 0 ); combo1.addItemListener( new ItemListener() { public void itemStateChanged( ItemEvent e ) { if( e.getStateChange() == ItemEvent.SELECTED ) { // combo1에서 아이템이 select되었을 때 처리할 과정 combo2.setModel(new GugunComboBoxModel((String)combo1.getSelectedItem())); // select할 때 guguncomboboxModel에 해당 선택 데이터를 set할 수 있도록 한다. combo2.setSelectedIndex(0); // 선택되었을 때 처음 데이터를 set할 수 있도록 한다. } } } ); combo1.setBounds( 21, 20, 160, 21 ); panel.add( combo1 ); combo2 = new JComboBox(); combo2.setModel(new GugunComboBoxModel()); combo2.addItemListener( new ItemListener() { public void itemStateChanged( ItemEvent e ) { if( e.getStateChange() == ItemEvent.SELECTED ) { combo3.setModel(new DongComboBoxModel((String)combo1.getSelectedItem(),(String)combo2.getSelectedItem())); // select할 때 guguncomboboxModel에 해당 선택 데이터를 set할 수 있도록 한다. combo3.setSelectedIndex(0); // 선택되었을 때 처음 데이터를 set할 수 있도록 한다. } } } ); combo2.setBounds( 202, 20, 160, 21 ); panel.add( combo2 ); combo3 = new JComboBox(); combo3.setModel(new DongComboBoxModel()); combo3.addItemListener( new ItemListener() { public void itemStateChanged( ItemEvent e ) { if( e.getStateChange() == ItemEvent.SELECTED ) { textArea.setText(""); ZipcodeDAO dao = new ZipcodeDAO(); ArrayList<ZipcodeTO> datas = dao.listAddress((String)combo1.getSelectedItem(),(String)combo2.getSelectedItem(),(String)combo3.getSelectedItem()); for(ZipcodeTO to:datas) { //데이터 배열을 끝까지 읽을 수 있도록 하는 향상된 for문 String address = String.format("[%s] %s %s %s %s %s", to.getZipcode(),to.getSido(),to.getGugun(), to.getDong(),to.getRi(),to.getBunji()); textArea.append(address+System.lineSeparator()); } } } } ); combo3.setBounds( 383, 20, 160, 21 ); panel.add( combo3 ); JScrollPane scrollPane = new JScrollPane(); scrollPane.setEnabled(false); scrollPane.setBounds(12, 80, 560, 671); contentPane.add(scrollPane); textArea = new JTextArea(); scrollPane.setViewportView(textArea); } } |
ZipcodeDAO.java - 생성자 정의 |
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 { Connection conn; public ZipcodeDAO() { String url = "jdbc:mariadb://localhost:3306/project"; String user = "project"; String password = "123456"; try { Class.forName( "org.mariadb.jdbc.Driver" ); this.conn = DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException e) { System.out.println( "에러 " + e.getMessage() ); } catch (SQLException e) { System.out.println( "에러 " + e.getMessage() ); } } public ArrayList<ZipcodeTO> listSido(){ //각 생성자를 ArrayList로 만들어 다르게 참조 Stirng -> sido데이터 하나만 전송 / ZipcodeTo처럼 DTO로 보내는거면 캡슐화 시켜서 보내겠다는 뜻 PreparedStatement pstmt = null; //각 생성자에는 sql문을 작성할 준비를 한다. ResultSet rs = null; ArrayList<ZipcodeTO> sidos = new ArrayList<ZipcodeTO>(); try { String sql ="select distinct sido from zipcode"; pstmt = conn.prepareStatement(sql); rs=pstmt.executeQuery(); while(rs.next()) { ZipcodeTO to = new ZipcodeTO(); to.setSido(rs.getString("sido")); //열 번호에 따라 get할 수 있는게 다르다. sidos.add(to); } } catch (SQLException e) { System.out.println( "에러 " + e.getMessage() ); } finally { if( rs != null ) try { rs.close(); } catch(SQLException e1) {} if( pstmt != null ) try { pstmt.close(); } catch(SQLException e1) {} if( conn != null ) try { conn.close(); } catch(SQLException e1) {} } return sidos; //어떤 시/도 가 있는지에 대한 내용을 return 한다. } public ArrayList<ZipcodeTO> listGugun(String strSido){ PreparedStatement pstmt = null; ResultSet rs = null; ArrayList<ZipcodeTO> guguns = new ArrayList<ZipcodeTO>(); try { String sql ="select distinct gugun from zipcode where sido=?"; pstmt = 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) { System.out.println( "에러 " + e.getMessage() ); } finally { if( rs != null ) try { rs.close(); } catch(SQLException e1) {} if( pstmt != null ) try { pstmt.close(); } catch(SQLException e1) {} if( conn != null ) try { conn.close(); } catch(SQLException e1) {} } return guguns; } public ArrayList<ZipcodeTO> listDong(String strSido, String strGugun){ PreparedStatement pstmt = null; ResultSet rs = null; ArrayList<ZipcodeTO> dongs = new ArrayList<ZipcodeTO>(); try { String sql ="select distinct dong from zipcode where sido=? and gugun=?"; pstmt = 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) { System.out.println( "에러 " + e.getMessage() ); } finally { if( rs != null ) try { rs.close(); } catch(SQLException e1) {} if( pstmt != null ) try { pstmt.close(); } catch(SQLException e1) {} if( conn != null ) try { conn.close(); } catch(SQLException e1) {} } return dongs; //어떤 시/도 가 있는지에 대한 내용을 return 한다. } public ArrayList<ZipcodeTO> listAddress(String strSido, String strGugun, String strDong){ PreparedStatement pstmt = null; ResultSet rs = null; ArrayList<ZipcodeTO> addresses = new ArrayList<ZipcodeTO>(); try { String sql ="select * from zipcode where sido=? and gugun=? and dong=?"; pstmt = 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.setSido( rs.getString( "sido" ) ); to.setGugun( rs.getString( "gugun" ) ); to.setDong( rs.getString( "dong" ) ); to.setRi( rs.getString( "ri" ) ); to.setBunji( rs.getString( "bunji" ) ); addresses.add(to); } } catch (SQLException e) { System.out.println( "에러 " + e.getMessage() ); } finally { if( rs != null ) try { rs.close(); } catch(SQLException e1) {} if( pstmt != null ) try { pstmt.close(); } catch(SQLException e1) {} if( conn != null ) try { conn.close(); } catch(SQLException e1) {} } return addresses; } } |
ZipcodeTO.java - getter / setter 정의 |
public class ZipcodeTO {
private String zipcode; private String sido; private String gugun; private String dong; private String ri; private String 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; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } public void setSido(String sido) { this.sido = sido; } public void setGugun(String gugun) { this.gugun = gugun; } public void setDong(String dong) { this.dong = dong; } public void setRi(String ri) { this.ri = ri; } public void setBunji(String bunji) { this.bunji = bunji; } } |
SidoComboBoxModel.java - 시/도를 출력할 수 있도록 하는 콤보박스모델 |
import java.util.ArrayList; import javax.swing.DefaultComboBoxModel; public class SidoComboBoxModel extends DefaultComboBoxModel<String> { private ArrayList<ZipcodeTO> sidos; public SidoComboBoxModel() { 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.java - 구/군을 출력할 수 있는 콤보박스 모델 |
import java.util.ArrayList; import javax.swing.DefaultComboBoxModel; public class GugunComboBoxModel extends DefaultComboBoxModel<String> { private ArrayList<ZipcodeTO> guguns; public GugunComboBoxModel() { // 기본생성자 } public GugunComboBoxModel(String strSido) { //인자 값이 있는 생성자를 따로 만들어 sido값을 적용할 수 있도록 한다 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.java - 동을 출력할 수 있는 콤보박스 모델 |
import java.util.ArrayList; import javax.swing.DefaultComboBoxModel; public class DongComboBoxModel extends DefaultComboBoxModel<String> { private ArrayList<ZipcodeTO> dongs; public DongComboBoxModel() { // 기본생성자 } public DongComboBoxModel(String strSido , String strGugun) { //인자 값이 있는 생성자를 따로 만들어 sido값을 적용할 수 있도록 한다 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(); } } |
JList
- 데이터가 짤리면 안보이기 때문에 scrollPane을 설정해주어 스크롤이 가능하도록 한다.
(오른쪽클릭 - surround with - scrollPane)
JListEx01.java - 리스트 출력 |
import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JList; import java.awt.Color; import javax.swing.AbstractListModel; import javax.swing.ListSelectionModel; import javax.swing.JScrollPane; import javax.swing.JButton; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionEvent; public class JListEx01 extends JFrame { private JPanel contentPane; private JList list; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { JListEx01 frame = new JListEx01(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public JListEx01() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(12, 22, 186, 171); contentPane.add(scrollPane); list = new JList(); list.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if(e.getValueIsAdjusting()) { //중복출력을 없애주는 코드 return; } System.out.println(list.getSelectedValue()); //deselect가 같이 있기 때문에 두번찍힌다 } }); scrollPane.setViewportView(list); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); /*list.setModel(new AbstractListModel() { String[] values = new String[] {"사과", "참외", "수박", "딸기", "자두", "포도", "사과", "참외", "수박", "딸기", "자두", "포도"}; public int getSize() { return values.length; } public Object getElementAt(int index) { return values[index]; } });*/ list.setModel(new CustomListModel()); //customListModel을 이용해서 위 주석 부분을 따로 떼어냈다. list.setSelectedIndex(3); JButton btn = new JButton("New button"); btn.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { System.out.println(list.getSelectedIndex()); //선택된 리스트의 인덱스 번호를 반환 System.out.println((String)list.getSelectedValue()); // 선택된 목록의 내용을 반환 } }); btn.setBounds(12, 205, 97, 23); contentPane.add(btn); } } |
CustomListModel.java - 리스트 모델 커스텀하기 |
import java.util.ArrayList; import javax.swing.AbstractListModel; public class CustomListModel extends AbstractListModel<String> { //private String[] values = new String[] {"사과", "참외", "수박", "딸기", "자두", "포도", "사과", "참외", "수박", "딸기", "자두", "포도"}; private ArrayList<String> values; public CustomListModel() { values=new ArrayList<String>(); values.add("사과"); values.add("참외"); values.add("수박"); values.add("자두"); values.add("포도"); values.add("사과"); } @Override public int getSize() { // TODO Auto-generated method stub //return values.length; //String일 때 return values.size(); //Arraylist일 때 } @Override public String getElementAt(int index) { // TODO Auto-generated method stub // return values[index]; //String일 때 return values.get(index); //Arraylist일 때 } } |
특정 사원 정보 출력 프로그램
알고리즘
사원의 이름을 넣고 검색하면
해당 사원의 이름이 뜨고
이름을 선택하면 사원정보를 출력하는 프로그램
1. 사원의 이름을 넣고 검색할 수 있도록 함
2. 해당 사원의 이름이 뜨도록 함 (비슷해도 뜨기) 이름 앞뒤로 %넣기
3. 이름 선택 시 정보를 받아 area에 뜨도록 함
DB
> select ename from emp where ename like 'SM%'; //이름 검색
EmployeeSearch.java - 사원 정보 출력 UI |
package EmployeeSearchEx01; 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 javax.swing.JList; import javax.swing.JScrollPane; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionEvent; public class EmployeeSearch extends JFrame { private JPanel contentPane; private JTextField textField1; private JList list; private JButton btn1; private JTextArea textArea; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { EmployeeSearch frame = new EmployeeSearch(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public EmployeeSearch() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); 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)), "\uC0AC\uC6D0\uC774\uB984 \uAC80\uC0C9\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0))); panel.setBounds(23, 16, 542, 46); contentPane.add(panel); panel.setLayout(null); JLabel lbl1 = new JLabel("사원이름"); lbl1.setBounds(6, 21, 57, 15); panel.add(lbl1); textField1 = new JTextField(); textField1.setBounds(73, 18, 342, 21); panel.add(textField1); textField1.setColumns(10); btn1 = new JButton("검색"); btn1.addMouseListener(new MouseAdapter() { //검색 누르면 검색되는곳 @Override public void mouseClicked(MouseEvent e) { list.setModel(new CustomListModel(textField1.getText()) ); } }); btn1.setBounds(439, 17, 97, 23); panel.add(btn1); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(27, 74, 527, 228); contentPane.add(scrollPane); list = new JList(); list.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if(e.getValueIsAdjusting()) { //중복출력을 없애주는 코드 return; } //System.out.println(list.getSelectedValue()); // 리스트에서 선택한 이름 출력 textArea.setText(""); EmploySearchDAO dao = new EmploySearchDAO(); ArrayList<EmployeeSearchTO> datas = dao.printEmployee((String)list.getSelectedValue()); for(EmployeeSearchTO to:datas) { //데이터 배열을 끝까지 읽을 수 있도록 하는 향상된 for문 String employee = String.format("[%s] %s %s %s %s", to.getEmpno(),to.getJob(),to.getHiredate(), to.getSal(),to.getDeptno()); textArea.append(employee+System.lineSeparator()); } } }); scrollPane.setViewportView(list); textArea = new JTextArea(); textArea.setEditable(false); textArea.setBounds(32, 354, 525, 56); contentPane.add(textArea); } } |
CustomListModel.java - 사원리스트 커스텀 모델 |
package EmployeeSearchEx01; import java.util.ArrayList; import javax.swing.AbstractListModel; public class CustomListModel extends AbstractListModel<String> { private ArrayList<EmployeeSearchTO> values; public CustomListModel() { } public CustomListModel(String name) { // TODO Auto-generated constructor stub EmploySearchDAO dao = new EmploySearchDAO(); values = dao.listEmployee(name); } @Override public int getSize() { return values.size(); //Arraylist일 때 } @Override public String getElementAt(int index) { EmployeeSearchTO to= values.get(index); return to.getEname(); //Arraylist일 때 } } |
EmployeeSearchTO.java - DTO |
package EmployeeSearchEx01;
import java.sql.Date; public class EmployeeSearchTO { private int empno; private String ename; private String job; private int mgr; private Date hiredate; private double sal; private double comm; private int deptno; public int getEmpno() { return empno; } public String getEname() { return ename; } public String getJob() { return job; } public int getMgr() { return mgr; } public Date getHiredate() { return hiredate; } public double getSal() { return sal; } public double getComm() { return comm; } public int getDeptno() { return deptno; } public void setEmpno(int empno) { this.empno = empno; } public void setEname(String ename) { this.ename = ename; } public void setJob(String job) { this.job = job; } public void setMgr(int mgr) { this.mgr = mgr; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } public void setSal(double sal) { this.sal = sal; } public void setComm(double comm) { this.comm = comm; } public void setDeptno(int deptno) { this.deptno = deptno; } } |
EmployeeSearchDAO.java - DAO |
package EmployeeSearchEx01; 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 EmploySearchDAO { Connection conn; public EmploySearchDAO() { String url = "jdbc:mariadb://localhost:3306/sample"; String user = "root"; String password = "!123456"; try { Class.forName( "org.mariadb.jdbc.Driver" ); this.conn = DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException e) { System.out.println( "에러 " + e.getMessage() ); } catch (SQLException e) { System.out.println( "에러 " + e.getMessage() ); } } public ArrayList<EmployeeSearchTO> listEmployee(String name){ //각 생성자를 ArrayList로 만들어 다르게 참조 Stirng -> sido데이터 하나만 전송 / ZipcodeTo처럼 DTO로 보내는거면 캡슐화 시켜서 보내겠다는 뜻 PreparedStatement pstmt = null; //각 생성자에는 sql문을 작성할 준비를 한다. ResultSet rs = null; ArrayList<EmployeeSearchTO> employees = new ArrayList<EmployeeSearchTO>(); try { String sql =" select ename from emp where ename like ?"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, name+"%"); rs=pstmt.executeQuery(); while(rs.next()) { EmployeeSearchTO to = new EmployeeSearchTO(); to.setEname(rs.getString("ename")); employees.add(to); } } catch (SQLException e) { System.out.println( "에러 " + e.getMessage() ); } finally { if( rs != null ) try { rs.close(); } catch(SQLException e1) {} if( pstmt != null ) try { pstmt.close(); } catch(SQLException e1) {} if( conn != null ) try { conn.close(); } catch(SQLException e1) {} } return employees; //어떤 시/도 가 있는지에 대한 내용을 return 한다. } public ArrayList<EmployeeSearchTO> printEmployee(String name) { //사원 이름을 바탕으로 사원정보출력 (정보출력은 우편번호화 같이) PreparedStatement pstmt = null; //각 생성자에는 sql문을 작성할 준비를 한다. ResultSet rs = null; ArrayList<EmployeeSearchTO> employees = new ArrayList<EmployeeSearchTO>(); try { String sql ="select * from emp where ename like ?"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, name); rs=pstmt.executeQuery(); while(rs.next()) { EmployeeSearchTO to = new EmployeeSearchTO(); to.setEname(rs.getString("ename")); to.setEmpno( rs.getInt( "empno" ) ); to.setJob( rs.getString( "job" ) ); to.setHiredate( rs.getDate( "hiredate" ) ); to.setSal( rs.getDouble( "sal" ) ); to.setDeptno( rs.getInt( "deptno" ) ); employees.add(to); } } catch (SQLException e) { System.out.println( "에러 " + e.getMessage() ); } finally { if( rs != null ) try { rs.close(); } catch(SQLException e1) {} if( pstmt != null ) try { pstmt.close(); } catch(SQLException e1) {} if( conn != null ) try { conn.close(); } catch(SQLException e1) {} } return employees; //어떤 시/도 가 있는지에 대한 내용을 return 한다. } } |
JTable
- 기본 UI에 커스텀 모델을 만들어서 적용시키는 방식으로 하는 게 깔끔하다.
JtableEx01.java - 테이블 생성 UI |
import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JTable; import javax.swing.JScrollPane; import javax.swing.table.DefaultTableModel; import javax.swing.ListSelectionModel; public class JtableEx01 extends JFrame { private JPanel contentPane; private JTable table; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { JtableEx01 frame = new JtableEx01(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public JtableEx01() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(93, 97, 211, 119); contentPane.add(scrollPane); table = new JTable(); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); /*table.setModel(new DefaultTableModel( new Object[][] { {"1", "2", "3"}, {"8", "5", "6"}, {null, null, null}, {null, "4", null}, {null, null, null}, {null, null, null}, {null, null,"9"}, {null, null, null}, {null, null, null}, {null, null, null}, {null, null, null}, }, new String[] { "1\uC5F4", "2\uC5F4", "3\uC5F4" } ) { boolean[] columnEditables = new boolean[] { false, false, false }; public boolean isCellEditable(int row, int column) { return columnEditables[column]; } }); */ table.setModel(new CustomTableModel03()); table.getColumnModel().getColumn(0).setResizable(false); table.getColumnModel().getColumn(2).setResizable(false); scrollPane.setViewportView(table); } } |
CustomTableModel.java - 기본 행과 열이 있는 테이블 생성하기 |
import javax.swing.table.AbstractTableModel;
public class CustomTableModel extends AbstractTableModel { //해당 내용 ArrayList로 바꾸기 private String[][] datas= new String[][] { {"1", "2", "3"}, {"8", "5", "6"}, {null, null, null}, {null, "4", null}, {null, null, null}, {null, null, null}, {null, null,"9"}, {null, null, null}, {null, null, null}, {null, null, null}, {null, null, null}, }; private String[] columnNames = new String[] { //열 이름 "1\uC5F4", "2\uC5F4", "3\uC5F4" }; @Override public String getColumnName(int column) { return columnNames[column]; } @Override public int getRowCount() { // TODO Auto-generated method stub return datas.length; } @Override public int getColumnCount() { // TODO Auto-generated method stub return datas[0].length; } @Override public Object getValueAt(int rowIndex, int columnIndex) { // TODO Auto-generated method stub return datas[rowIndex][columnIndex]; } } |
CustomTableModel02.java - ArrayList로 테이블 만들기 |
import java.util.ArrayList; import javax.swing.table.AbstractTableModel; public class CustomTableModel02 extends AbstractTableModel { //해당 내용 ArrayList로 바꾸기 private ArrayList<ArrayList<String>> datas; private String[] columnNames = new String[] { //열 이름 "1\uC5F4", "2\uC5F4", "3\uC5F4" }; public CustomTableModel02() { datas = new ArrayList<ArrayList<String>>(); ArrayList<String> data1 = new ArrayList<String>(); data1.add("11"); data1.add("12"); data1.add("13"); ArrayList<String> data2 = new ArrayList<String>(); data2.add("21"); data2.add("22"); data2.add("23"); datas.add(data1); datas.add(data2); } @Override public String getColumnName(int column) { return columnNames[column]; } @Override public int getRowCount() { // TODO Auto-generated method stub return datas.size(); } @Override public int getColumnCount() { // TODO Auto-generated method stub return datas.get(0).size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { // TODO Auto-generated method stub return datas.get(rowIndex).get(columnIndex); } } |
CustomTableModel03.java - 데이터베이스에 연결해서 테이블 내용 생성하기 |
import java.util.ArrayList; import javax.swing.table.AbstractTableModel; public class CustomTableModel03 extends AbstractTableModel { //해당 내용 ArrayList로 바꾸기 private ArrayList<DeptTO> datas; private String[] columnNames = new String[] { //열 이름 "1\uC5F4", "2\uC5F4", "3\uC5F4" }; public CustomTableModel03() { datas = new ArrayList<DeptTO>(); /* DeptTO to1 = new DeptTO(); to1.setDeptno("10"); to1.setDname("연구부"); to1.setLoc("서울"); DeptTO to2 = new DeptTO(); to2.setDeptno("20"); to2.setDname("생산부"); to2.setLoc("서울"); datas.add(to1); datas.add(to2); */ DeptDAO dao = new DeptDAO(); datas=dao.listDept(); } @Override public String getColumnName(int column) { return columnNames[column]; } @Override public int getRowCount() { // TODO Auto-generated method stub return datas.size(); } @Override public int getColumnCount() { // TODO Auto-generated method stub return 3; } @Override public Object getValueAt(int rowIndex, int columnIndex) { // TODO Auto-generated method stub String result=""; DeptTO to =datas.get(rowIndex); switch(columnIndex) { case 0: result=to.getDeptno(); break; case 1: result=to.getDname(); break; case 2: result=to.getLoc(); break; } return result; } } |
DeptDAO.java - DB연동 DAO |
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 EmployeeSearchEx01.EmployeeSearchTO; public class DeptDAO { private Connection conn; public DeptDAO() { // TODO Auto-generated constructor stub String url = "jdbc:mariadb://localhost:3306/sample"; String user = "root"; String password = "!123456"; try { Class.forName( "org.mariadb.jdbc.Driver" ); this.conn = DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException e) { System.out.println( "에러 " + e.getMessage() ); } catch (SQLException e) { System.out.println( "에러 " + e.getMessage() ); } } public ArrayList<DeptTO> listDept(){ PreparedStatement pstmt = null; ResultSet rs = null; ArrayList<DeptTO> depts = new ArrayList<DeptTO>(); try { String sql ="select * from dept"; pstmt = conn.prepareStatement(sql); rs=pstmt.executeQuery(); while(rs.next()) { DeptTO to = new DeptTO(); to.setDeptno( rs.getString( "deptno" ) ); to.setDname( rs.getString( "dname" ) ); to.setLoc( rs.getString( "loc" ) ); depts.add(to); } } catch (SQLException e) { System.out.println( "에러 " + e.getMessage() ); } finally { if( rs != null ) try { rs.close(); } catch(SQLException e1) {} if( pstmt != null ) try { pstmt.close(); } catch(SQLException e1) {} if( conn != null ) try { conn.close(); } catch(SQLException e1) {} } return depts; //어떤 시/도 가 있는지에 대한 내용을 return 한다. } } |
DeptTO - DB연동 DTO (데이터베이스 안의 속성 내용 순서와 동일하게 쓰도록 함) |
public class DeptTO {
private String deptno; private String dname; private String loc; public String getDeptno() { return deptno; } public String getDname() { return dname; } public String getLoc() { return loc; } public void setDeptno(String deptno) { this.deptno = deptno; } public void setDname(String dname) { this.dname = dname; } public void setLoc(String loc) { this.loc = loc; } } |
구구단 출력하기
GugudanTableEx01.java - UI |
package gugudanTable; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JLabel; import javax.swing.JSpinner; import javax.swing.JButton; import javax.swing.border.TitledBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import EmployeeSearchEx01.CustomListModel; import javax.swing.JScrollPane; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.ListSelectionModel; public class GugudanTableEx01 extends JFrame { private JPanel contentPane; private JTable table; private JSpinner spinner1; private JSpinner spinner2; private JTable table_1; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { GugudanTableEx01 frame = new GugudanTableEx01(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public GugudanTableEx01() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); 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)), "\uAD6C\uAD6C\uB2E8", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0))); panel.setBounds(20, 10, 552, 98); contentPane.add(panel); panel.setLayout(null); JLabel lbl1 = new JLabel("시작 단"); lbl1.setBounds(23, 20, 57, 15); panel.add(lbl1); JLabel lbl2 = new JLabel("끝 단"); lbl2.setBounds(23, 55, 57, 15); panel.add(lbl2); spinner1 = new JSpinner(); spinner1.setBounds(104, 17, 249, 22); panel.add(spinner1); spinner2 = new JSpinner(); spinner2.setBounds(104, 52, 249, 22); panel.add(spinner2); JButton btn1 = new JButton("구구단 출력"); btn1.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { System.out.println((Integer)spinner1.getValue()); System.out.println((Integer)spinner2.getValue()); table_1.setModel(new CustomTablegugudanEx01((Integer)spinner1.getValue(),(Integer)spinner2.getValue())); } }); btn1.setBounds(399, 32, 123, 38); panel.add(btn1); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(39, 142, 517, 357); contentPane.add(scrollPane); table_1 = new JTable(); table_1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); scrollPane.setViewportView(table_1); } } |
CustomTablegugudanEx01.java - 구구단 커스텀 |
package gugudanTable; import java.util.ArrayList; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableModel; public class CustomTablegugudanEx01 extends AbstractTableModel { //2차원 배열을 이용한 구구단 만들기? //private String[][] datas= new String[][] {}; private int[][] datas= new int[9][9]; private String[]columnNames=new String[] { "x1", "x2", "x3", "x4","x5","x6","x7","x8","x9" }; int k=0; public CustomTablegugudanEx01(int val1, int val2) { for(int i=val1 ;i<=val2;i++) { for(int j=0;j<9;j++) { datas[k][j]=i*(j+1); } k++; } } @Override public String getColumnName(int column) { return columnNames[column]; } @Override public int getRowCount() { // TODO Auto-generated method stub return datas.length; } @Override public int getColumnCount() { // TODO Auto-generated method stub return datas[0].length; } @Override public Object getValueAt(int rowIndex, int columnIndex) { // TODO Auto-generated method stub return datas[rowIndex][columnIndex]; } } |
=> 문제점: 배열의 크기를 지정해놨기 때문에 끝단을 지정하고 나서 만약 끝단이 6이라면 3개의 행이 남게 된다. 따라서 이를 동적으로 할당할 수 있는 무언가를 적용해야할 필요가 있다..
알고리즘
1. 기존 시도/구군/동 뜨게 하는 코드를 가지고 내용을 돌린다.
2. 해당 내용을 표에 넣을 수 있도록 한다 -> 표의 동적할당이 필요하다(구구단 문제 해결하기)
'Programming > JAVA' 카테고리의 다른 글
[JAVA] Network (0) | 2023.09.19 |
---|---|
[JAVA]GUI(5) - Layout (0) | 2023.09.18 |
[JAVA] GUI(3) (0) | 2023.09.14 |
[JAVA] GUI(2) (0) | 2023.09.12 |
[JAVA] 멀티스레드 + GUI(1) (0) | 2023.09.12 |