[JAVA_Back-End]

[JAVA] GUI(4) 본문

Programming/JAVA

[JAVA] GUI(4)

너굴위 2023. 9. 15. 16:40
728x90
반응형

< 이전 포스팅 정리 >

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. 해당 내용을 표에 넣을 수 있도록 한다 -> 표의 동적할당이 필요하다(구구단 문제 해결하기)

 

728x90
반응형

'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