티스토리 뷰
1) 과정 설명
1. 정보를 입력하고 등록버튼을 클릭하면 정보가 '파일'에 저장된다.
2. 인덱스 번호를 입력하고 검색 번호를 누르면 '파일에 저장된' 하나의 데이터가 출력된다.
3. 인덱스 번호를 입력하고 정보를 입력한 후, 수정버튼을 누르면
'파일에 저장된' 정보가 수정된다.
4. 인덱스 번호를 입력하고 삭제버튼을 누르면 파일에 저장된 정보가 삭제된다.
5. 전체검색을 클릭하면 모든 정보가 출력된다.
추가
1. 수정버튼을 누르면 전체 데이터를 테이블에 출력한다.
2. 삭제 버튼을 누르면 전체 데이터를 테이블에 출력한다.
3. 전체검색을 누르면 전체 데이터를 테이블에 출력한다.
2) 순서 설명
// 내가 다시 보려고 만든 순서
private static ContactDAO dao; //1
dao =ContactDAOImple.getInstance(); //2
"등록" > insertContact(); // 3
private void insertContact() { //4
String name = txtName.getText();
String phone = txtPhone.getText();
String email = txtEmail.getText();
ContactVO vo = new ContactVO(name, phone, email);
int result = dao.insert(vo); //여기서 오류 패키지 오류인듯
int size = ((ContactDAOImple)dao).getText();
if (result == 1) {
System.out.println("회원 정보 등록 완료");
}
}// end insertContact
"검색" > selectContact(); //5
private void selectContact() { //6
System.out.println("검색할 인덱스 입력>");
int index = Integer.parseInt(txtIndex.getText());
int count = ((ContactImple) dao).getCount();
if (index >= 0 && index < count) {
txtAreaInfo.setText(dao.select(index).toString()); //?왜 tostring 붙이는지 :: 메서드가 반환하는 객체를 문자열로 표시하기 위해
} else {
txtAreaLog.setText("해당 인덱스에 연락처가 없습니다.");
}
}
"수정" > updateContact(); //7
private void updateContact() {
int index = Integer.parseInt(txtIndex.getText());
int count = ((ContactImple) dao).getCount();
if (index >= 0 && index < count) {
System.out.println("비밀번호 입력 > ");
String phone = txtPhone.getText();
System.out.println("이메일 입력 > ");
String email = txtEmail.getText();
ContactVO dt = new ContactVO("", phone, email); // "" 은 이것 빼고 입력받는다
int result = dao.setText(index, dt);
if (result == 1) {
System.out.println("회원 정보 수정 완료");
}
}
}
"삭제" > 8
"전체검색" > 9
selectAllContactTable(); // 9
private void selectAllContactTable(){//9
ArrayList<ContactVO> list = dao.select();
for(int i = 0; i < list.size(); i++) {
ContactVO vo = list.get(i);
recodes[0] = i; // (0,0)
recodes[1] = vo.getName(); // (0,1)
recodes[2] = vo.getPhone(); // (0,2)
recodes[3] = vo.getEmail(); // (0,3)
tableModel.addRow(recodes);
}
} //end selectAllContactTable()
"등록" > 하고 테이블에 보여주기
selectAllContactTable(); //10
int row = table.getSelectedRow(); // 11. 선택한row,column값을 리턴
int col = table.getSelectedColumn();
Object value = table.getValueAt(row, col);
System.out.println(value);
3) 실습 진행
- 오류났던 부분-
ContactVO에서 멤버 변수 네임 부터 생성자 getter,setter,등등 이름을 다 안바꿈
그래서 오류남;
package edu.java.contact05;
import java.io.Serializable;
public class ContactVO implements Serializable{
// 이름 전체 변경 : Shift + Alt + R
//멤버 변수 생성
private String name; // 이름
private String phone; // 전화번호
private String email; // 이메일
//기본 생성자
public ContactVO() {}
//매개변수 생성자
public ContactVO(String name, String phone, String email) {
super();
this.name = name;
this.phone = phone;
this.email = email;
}
//getter/setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
//toString()
@Override
public String toString() {
return "ContactVO [name=" + name + ", phone=" + phone + ", email=" + email + "]";
}
}//end ContactVO
package edu.java.contact05;
import java.util.ArrayList;
public interface ContactDAO {
//회원 정보 등록
public abstract int insert(ContactVO dt); // dt를 입력받기
//회원 정보 전체 검색
public abstract ArrayList<ContactVO> select(); // 저장된 배열을 전부 보여주기
//회원 정보 인덱스 검색
public abstract ContactVO select(int index); //입력받고 리턴해주기
//회원 정보 인덱스 수정
public abstract int update(int index, ContactVO dt); //수정할 인덱스 입력받고 수정해서 다시 해당 배열에 넣기
//회원 정보 인덱스 삭제
public abstract int delete(int index); //삭제할 인덱스 입력받고 삭제하기
}//end ContactDAO
package edu.java.contact05;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ContactDAOImple implements ContactDAO {
// 싱글톤 디자인 패턴 적용
// 1. private static 자기 자신 타입의 변수 선언
private static ContactDAOImple instance = null;
// 2. private 생성자
private ContactDAOImple() {
initDataDir();
initDataFile();
}
// 3. public static 메소드 - 인스턴스를 리턴하는 메소드 구현
public static ContactDAO getInstance() {
if(instance == null) {
instance = new ContactDAOImple();
}
return instance;
}
//ContactDTO[] list -> ArrayList<ContactDTO> list
private final int MAX = 100; //최대 회원수
//private ContactDTO[] list = new ContactDTO[MAX]; // 회원 정보를 저장할 배열 list 생성
private static ArrayList<ContactVO> list = new ArrayList<>(); // 회원 정보를 저장할 List<> list 생성
//*
//데이터를 저장할 폴더와 파일 이름 정의
private static final String DATA_DIR = "data";
private static final String DATA_FILE = "contact.data";
// data 폴더의 contact.data 파일을 관리할 File 객체 선언
private File dataDir;
private File dataFile;
// TODO : data 폴더가 있는지 검사하고, 없으면 생성하는 함수
private void initDataDir() {
System.out.println("initDataDir()");
// dataDir 변수를 생성하고, 초기화. 이때 DATA_DIR은 미리 정의된 디렉토리 경로.
dataDir = new File(DATA_DIR);
// dataDir 변수가 가리키는 디렉토리의 경로를 출력.
System.out.println("폴더 경로 : " + dataDir.getPath());
// dataDir 변수가 가리키는 디렉토리가 존재하지 않는 경우
if(!dataDir.exists()) {
System.out.println("폴더가 없습니다.");
// dataDir 디렉토리를 생성하고, 성공 또는 실패 여부를 반환.
if(dataDir.mkdirs()) {
System.out.println("폴더 생성 성공");
}else {
System.out.println("폴더 생성 실패");
}
}else {
System.out.println("폴더가 이미 존재합니다");
}
}//end initDataDir()
// TODO : 데이터 파일이 존재하는지 검사하고,
// 없는 경우 - 새로운 데이터 파일 생성
// 있는 경우 - 기존 파일에서 데이터를 읽어서 ArrayList에 추가
private void initDataFile() {
System.out.println("initDataFile()");
String filePath = DATA_DIR + File.separator + DATA_FILE;
dataFile = new File(filePath);
// dataFile 변수가 가리키는 파일이 존재하지 않는 경우
if(!dataFile.exists()) {
System.out.println("파일이 없습니다!");
try {
if(dataFile.createNewFile()) {
System.out.println("파일 생성 성공");
}else {
System.out.println("파일 생성 실패");
}
}catch(IOException e){
System.out.println(e);
}
}else {
System.out.println("파일이 이미 존재합니다.");
if(dataFile.length() != 0) {
readDataFromFile();
}
}
}//end initDataFile()
// TODO : 멤버 변수 list 객체를 data\contact.data 파일에 저장(쓰기)
private void writeDataToFile() {
System.out.println("writeDataToFile()");
OutputStream out = null;
BufferedOutputStream bout = null;
ObjectOutputStream oout = null;
try {
out = new FileOutputStream("data/contact.data");
bout = new BufferedOutputStream(out);
oout = new ObjectOutputStream(bout);
oout.writeObject(list);
System.out.println("데이터 저장 완료");
} catch (Exception e) {
System.out.println(e);
} finally {
try {
oout.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}//end writeDateToFile()
// TODO : data\contact.data 파일에서 ArrayList 객체를 읽어와서
// 멤버변수 list에 저장(읽기)
private void readDataFromFile() {
//ArrayList 객체를 읽어오기
System.out.println("readDataFromFile()");
// 입력 스트림, 버퍼 입력 스트림, 객체 입력 스트림을 초기화
InputStream in = null;
BufferedInputStream bin = null;
ObjectInputStream oin = null;
try {
// 파일에서 읽어오기 위한 FileInputStream을 생성합니다.
in = new FileInputStream("data/contact.data");
// 입력 스트림을 버퍼 입력 스트림으로 래핑합니다.
bin = new BufferedInputStream(in);
// 버퍼 입력 스트림을 객체 입력 스트림으로 래핑합니다.
oin = new ObjectInputStream(bin);
list = (ArrayList<ContactVO>) oin.readObject();
System.out.println("데이터 불러옴");
} catch (Exception e) {
System.out.println(e);
} finally {
try {
oin.close(); // 사용한 입력 스트림들을 닫습니다.
} catch (IOException e) {
e.printStackTrace();
}
}
}//end readDataFromFile()
public int getCount(){
return list.size();
}
///
@Override
public int insert(ContactVO vo) {
writeDataToFile();
list.add(vo);
return 1; // 0 : 실패 , 1 : 성공
}
@Override
public ArrayList<ContactVO> select() {
return list;
}
@Override
public ContactVO select(int index) {
return list.get(index);
}
@Override
public int update(int index, ContactVO vo) {
list.get(index).setPhone(vo.getPhone());
list.get(index).setEmail(vo.getEmail());
writeDataToFile();
return 1;
}
@Override
public int delete(int index) {
list.remove(index); //삭제하기
writeDataToFile();
return 1;
}
}
package edu.java.contact05;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.JTable;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class ContactMain05 {
private JFrame frame;
private JTextField txtName, txtPhone, txtEmail, txtIndex;
private JTextArea txtAreaInfo, txtAreaLog;
public static ContactDAO dao;
/* 스윙 테이블을 사용하기 위한 멤버 변수 선언 */
private JTable table;
private String[] colNames = {"No", "이름", "전화번호", "이메일"}; // 테이블 헤더에 들어갈 이름들
private Object[] records = new Object[colNames.length]; // 테이블 데이터를 저장할 배열 객체
private DefaultTableModel tableModel; // 테이블 형태를 만들 모델 변수
public static void main(String[] args) {
dao = ContactDAOImple.getInstance();
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ContactMain05 window = new ContactMain05();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public ContactMain05() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 786, 662);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
Font lblFont = new Font("굴림", Font.PLAIN, 44);
int lblWidth = 176;
int lblHeight = 55;
JLabel lblNewLabel = new JLabel("연락처 프로그램 Version 0.5");
lblNewLabel.setFont(lblFont);
lblNewLabel.setBounds(12, 10, 746, 66);
frame.getContentPane().add(lblNewLabel);
JLabel lblName = new JLabel("이름");
lblName.setFont(lblFont);
lblName.setBounds(12, 86, lblWidth, lblHeight);
frame.getContentPane().add(lblName);
JLabel lblPhone = new JLabel("전화번호");
lblPhone.setFont(lblFont);
lblPhone.setBounds(12, 151, lblWidth, lblHeight);
frame.getContentPane().add(lblPhone);
JLabel lblEmail = new JLabel("이메일");
lblEmail.setFont(lblFont);
lblEmail.setBounds(12, 216, lblWidth, lblHeight);
frame.getContentPane().add(lblEmail);
Font txtFont = new Font("굴림", Font.PLAIN, 34);
int txtWidth = 286;
int txtHeight = 55;
txtName = new JTextField();
txtName.setFont(txtFont);
txtName.setBounds(200, 86, txtWidth, txtHeight);
frame.getContentPane().add(txtName);
txtName.setColumns(10);
txtPhone = new JTextField();
txtPhone.setFont(txtFont);
txtPhone.setBounds(200, 151, txtWidth, txtHeight);
frame.getContentPane().add(txtPhone);
txtPhone.setColumns(10);
txtEmail = new JTextField();
txtEmail.setFont(txtFont);
txtEmail.setBounds(200, 216, txtWidth, txtHeight);
frame.getContentPane().add(txtEmail);
txtEmail.setColumns(10);
Font btnFont = new Font("굴림", Font.PLAIN, 24);
JButton btnInsert = new JButton("등록");
btnInsert.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
insertContact();
}
});
btnInsert.setFont(btnFont);
btnInsert.setBounds(12, 281, 110, 46);
frame.getContentPane().add(btnInsert);
JButton btnSearch = new JButton("검색");
btnSearch.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
selectContact();
}
});
btnSearch.setFont(btnFont);
btnSearch.setBounds(256, 281, 110, 46);
frame.getContentPane().add(btnSearch);
JButton btnUpdate = new JButton("수정");
btnUpdate.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateContact();
}
});
btnUpdate.setFont(btnFont);
btnUpdate.setBounds(12, 337, 110, 46);
frame.getContentPane().add(btnUpdate);
JButton btnDelete = new JButton("삭제");
btnDelete.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
deleteContact();
}
});
btnDelete.setFont(btnFont);
btnDelete.setBounds(134, 337, 110, 46);
frame.getContentPane().add(btnDelete);
JButton btnAllSearch = new JButton("전체검색");
btnAllSearch.addActionListener((e) -> {
selectAllContact();
selectAllContactTable();
});
btnAllSearch.setFont(btnFont);
btnAllSearch.setBounds(256, 337, 190, 46);
frame.getContentPane().add(btnAllSearch);
txtIndex = new JTextField();
txtIndex.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
txtIndex.setText("");
}
});
txtIndex.setText("번호입력");
txtIndex.setFont(new Font("굴림", Font.PLAIN, 17));
txtIndex.setBounds(134, 281, 108, 46);
frame.getContentPane().add(txtIndex);
txtIndex.setColumns(5);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(12, 393, 480, 95);
frame.getContentPane().add(scrollPane);
txtAreaInfo = new JTextArea();
txtAreaInfo.setFont(new Font("굴림", Font.PLAIN, 16));
scrollPane.setViewportView(txtAreaInfo);
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(12, 498, 480, 95);
frame.getContentPane().add(scrollPane_1);
txtAreaLog = new JTextArea();
txtAreaLog.setFont(new Font("굴림", Font.PLAIN, 16));
scrollPane_1.setViewportView(txtAreaLog);
JScrollPane scrollPane_2 = new JScrollPane();
scrollPane_2.setBounds(504, 281, 254, 312);
frame.getContentPane().add(scrollPane_2);
// 테이블 초기화
tableModel = new DefaultTableModel(colNames, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
table = new JTable(tableModel);
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
Object value = table.getValueAt(row, col);
System.out.println(value);
}
});
table.setFont(new Font("굴림", Font.PLAIN, 15));
scrollPane_2.setViewportView(table);
} // end initialize()
// contactList 배열에 Contact 인스턴스를 저장
private void insertContact() {
String name = txtName.getText();
String phone = txtPhone.getText();
String email = txtEmail.getText();
// TODO : name, phone, email 중 하나라도 입력되지 않으면
// 경고창 띄우고 등록 기능 실행 x
ContactVO vo = new ContactVO(name, phone, email);
int result = dao.insert(vo);
int size = ((ContactDAOImple) dao).getCount();
if(result == 1) {
txtAreaLog.setText("등록된 연락처 개수 : " + size + "\n" + "연락처 등록 완료");
}
} // end insertContact()
private void selectAllContact() {
int size = ((ContactDAOImple) dao).getCount();
ArrayList<ContactVO> list = dao.select();
StringBuffer buffer = new StringBuffer();
long startTime = System.currentTimeMillis();
for(int i = 0; i < size; i++) {
buffer.append("연락처[" + i + "] \n"
+ list.get(i) + "\n");
}
txtAreaInfo.setText(buffer.toString());
long endTime = System.currentTimeMillis();
System.out.println("걸린 시간 : " + (endTime - startTime ));
} // end selectAllContact()
private void selectContact() {
int index = Integer.parseInt(txtIndex.getText());
int size = ((ContactDAOImple) dao).getCount();
if(index >= 0 && index < size) {
ContactVO vo = dao.select(index);
txtAreaInfo.setText(vo.toString());
} else {
txtAreaLog.setText("해당 인덱스에 연락처가 없습니다.");
}
} // end selectContact()
private void updateContact() {
int index = Integer.parseInt(txtIndex.getText());
int size = ((ContactDAOImple) dao).getCount();
if(index >= 0 && index < size) {
String name = txtName.getText();
String phone = txtPhone.getText();
String email = txtEmail.getText();
// TODO : name, phone, email 중 하나라도 입력되지 않으면
// 경고창 띄우고 등록 기능 실행 x
ContactVO vo = new ContactVO(name, phone, email);
int result = dao.update(index, vo);
if(result == 1) {
txtAreaLog.setText("연락처 수정 완료!");
selectAllContactTable();
}
} else {
txtAreaLog.setText("해당 인덱스에 연락처가 없습니다.");
}
} // end updateContact()
private void deleteContact() {
int index = Integer.parseInt(txtIndex.getText());
int size = ((ContactDAOImple) dao).getCount();
if(index >= 0 && index < size) {
int result = dao.delete(index);
txtAreaLog.setText("연락처 삭제 완료!");
selectAllContactTable();
} else {
txtAreaLog.setText("해당 인덱스에 연락처가 없습니다.");
}
} // deleteContact()
private void selectAllContactTable() {
ArrayList<ContactVO> list = dao.select();
tableModel.setRowCount(0);
for(int i = 0; i < list.size(); i++) {
records[0] = i;
records[1] = list.get(i).getName();
records[2] = list.get(i).getPhone();
records[3] = list.get(i).getEmail();
tableModel.addRow(records);
}
}
} // end ContactMain05
'백엔드 교육과정 > 2월' 카테고리의 다른 글
2024.02.29_SQL_ch 5,6 / JDBC (0) | 2024.02.29 |
---|---|
2024_02_28_ SQL 설치 & 기본 문법 (0) | 2024.02.28 |
2024.02.27_연락처 프로그램 (Ver. 0.5) , GUI09 ~14 (0) | 2024.02.27 |
2024.02.26_GUI_Window Builder 설치 , 사용(GUI01~GUI08) (0) | 2024.02.26 |
2024.02.23_File 클래스(생성,삭제) , 연락처 ver 0.3 , 복습시 사용 사이트 추천 (0) | 2024.02.23 |