190502_Day18 MVC Model2,
public class Person {
//속성정의
private int no;
private String name;
private int age;
private String job;
public Person() {
}
public Person(int no, String name, int age, String job) {
this.no = no;
this.name = name;
this.age = age;
this.job = job;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
@Override
public String toString() {
return "Person [no=" + no + ", name=" + name + ", age=" + age + ", job=" + job + "]";
}
// @Override
// public String toString() {
// return no+": ["+name+","+age+","+job+"]";
// }
}//class Person
import java.util.Vector;
public class Model {
public Vector<Person> personv;//데이터 저장소
private int no;//입력될 Person에 유일한 번호를 부여
public Model() {
personv = new Vector<Person>();
}
//---------- Vector personv를 기준으로 추가,삭제,수정,조회 작업 ------------------------
public void insert(Person p){
no++;
p.setNo(no);
personv.add(p);
}
public void update(Person newp){
//전체 벡터 조회 (일치하는 번호의 Person정보 얻기)
for(int i=0; i<personv.size(); i++) {
Person oldp = personv.get(i);
if(oldp.getNo() == newp.getNo()) {//일치하는 번호를 찾았다면
//수정 작업
oldp.setAge( newp.getAge());
oldp.setJob( newp.getJob());
}
}
} //update
public void delete(int no){}
public Person select(int no){//용도: 수정폼에 출력
//전체 벡터 조회 (일치하는 번호의 Person정보 얻기)
for(int i=0; i<personv.size(); i++) {
Person oldp = personv.get(i);
if(oldp.getNo() == no) {//일치하는 번호를 찾았다면
return oldp;
}
}
return null;
}
public Vector<Person> selectAll( ){//용도: JTable출력
return personv;
}
}
- View
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import com.encore.person.model.Person;
public class MainView extends JFrame{
DefaultTableModel dtm;
public JTable table;
//public 명시이유? 다른 패키지에 있는 클래스(컨트롤러)에서 사용하기 때문.
JScrollPane scroll_table;
public JButton bt_insert, bt_del, bt_update, bt_exit;
JPanel southp;
public MainView() {
setTitle("MainView");
Object [][]rowData = new Object[0][4];
//행 크기 0인 이유? 시작을(앞으로 JTable에 추가될 행을) 0인덱스(첫행)부터 하기 위해서
String []columTitle = {"번호","이름","나이","직업"};
dtm = new DefaultTableModel(rowData,columTitle);
//dtm생성이유? dtm내의 addRow() , removeRow() 사용하기 위해서!!
table = new JTable(dtm);
scroll_table = new JScrollPane(table);
//scroll_table생성이유? 1. 테이블(사이즈)을 벗어나는 데이터를 보기 위해서 (스크롤바가 필요)!!
// 2. 테이블의 컬럼명을 보여줄 수 있음.
bt_insert = new JButton("입력");
bt_update = new JButton("수정");
bt_del = new JButton("삭제");
bt_exit = new JButton("종료");
southp = new JPanel();
southp.add(bt_insert);
southp.add(bt_update);
southp.add(bt_del);
southp.add(bt_exit);
add("Center", scroll_table);
add("South", southp);
setBounds(300,200,350,300);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}//생성자
//MainView - JTable이 원하는 타입1 : Object []rowData1= {1, "나길동", 13, "학생"};
//- JTable이 원하는 타입2 : Vector<String> rowData2 = new Vector<>();
// rowData2.add("2"); // 0
// rowData2.add("너주원"); // 1
// rowData2.add("15"); // 2
// rowData2.add("학생"); // 3
// rowData2.get(0) ---> "2"
// rowData2.get(1) ---> "너주원"
// rowData2.get(2) ---> "15"
// rowData2.get(3) ---> "학생"
//===========================================================================
//Controller를 통해 전달받은 데이터 타입
// - Vector<Person> personv = new Vector<>();
// personv.get(0) ---> Person p1 = new Person(1,"홍길동",13,"학생");
// personv.get(1) ---> Person p2 = new Person(2,"너주원",15,"학생");
// personv.get(2) ---> Person p3 = new Person(3,"길라임",16,"학생");
// personv.get(3) ---> Person p4 = new Person(4,"김유신",17,"학생");
//벡터안에 저장된 Person정보를 JTable에 출력하는 기능.
public void displayTable(Vector<Person> personv) {
dtm.setRowCount(0);//새로 addRow되는 행 데이터를 0인덱스 부터 출력하겠음!!
//이전에 JTable에 출력된 내용을 clear하는 역할!!
for(int i=0; i<personv.size(); i++) {//벡터의 인덱스 수 == 사람의 수
Person p = personv.get(i);
Object []rowData= {p.getNo(), p.getName(), p.getAge(), p.getJob()};
dtm.addRow(rowData);
}
}//displayTable
// public void displayTable() {
// Object []rowData1= {1, "나길동", 13, "학생"};
// //인덱스 0 1 2 3
//
// Vector<Object> rowData2 = new Vector<>();
// //인덱스
// rowData2.add(2); // 0
// rowData2.add("너주원"); // 1
// rowData2.add(15); // 2
// rowData2.add("학생"); // 3
//
// //dtm.addRow(1차원배열);
// dtm.addRow(rowData1);
// //dtm.addRow(벡터);
// dtm.addRow(rowData2);
// }
}//MainView
package com.encore.person.view;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class UpForm extends JFrame{
JLabel la_name, la_age, la_job;
public JTextField tf_name, tf_age, tf_job;
public JButton bt_submit, bt_cancel;
public int upNo;
public UpForm() {
setTitle("수정폼");//텍스트 변경
la_name = new JLabel("이름");
la_age = new JLabel("나이");
la_job = new JLabel("직업");
tf_name = new JTextField();
tf_name.setEnabled(false);
//수정폼에 tf_name을 비활성화한 이유? 벡터에 저장되어있는 Person내의 이름은 변경하지 않겠다!!
tf_age = new JTextField();
tf_job = new JTextField();
bt_submit = new JButton("수정");//텍스트 변경
bt_cancel = new JButton("취소");
//la_name.setBounds(x, y, width, height);
la_name.setBounds(30,30, 30,30);
la_age.setBounds(30,80, 30,30);
la_job.setBounds(30,130, 30,30);
tf_name.setBounds(70,30, 120,30);
tf_age.setBounds(70,80, 120,30);
tf_job.setBounds(70,130, 120,30);
bt_submit.setBounds(40,180, 70,30);
bt_cancel.setBounds(120,180, 70,30);
setLayout(null);
add(la_name);
add(la_age);
add(la_job);
add(tf_name);
add(tf_age);
add(tf_job);
add(bt_submit);
add(bt_cancel);
setBounds(500,200,240,280);
//setVisible(true);
//setDefaultCloseOperation(EXIT_ON_CLOSE);
}//생성자
}//UpForm
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class InputForm extends JFrame{
JLabel la_name, la_age, la_job;
public JTextField tf_name, tf_age, tf_job;
public JButton bt_submit, bt_cancel;
public InputForm() {
setTitle("입력폼");
la_name = new JLabel("이름");
la_age = new JLabel("나이");
la_job = new JLabel("직업");
tf_name = new JTextField();
tf_age = new JTextField();
tf_job = new JTextField();
bt_submit = new JButton("입력");
bt_cancel = new JButton("취소");
//la_name.setBounds(x, y, width, height);
//프레임에 붙는 컴포넌트에 시작좌표(location)와 사이즈를 설정하는 이유? NullLayout인 컨테이너에 부착시킬 때 필요.
la_name.setBounds(30,30, 30,30);
la_age.setBounds(30,80, 30,30);
la_job.setBounds(30,130, 30,30);
tf_name.setBounds(70,30, 120,30);
tf_age.setBounds(70,80, 120,30);
tf_job.setBounds(70,130, 120,30);
bt_submit.setBounds(40,180, 70,30);
bt_cancel.setBounds(120,180, 70,30);
setLayout(null);
add(la_name);
add(la_age);
add(la_job);
add(tf_name);
add(tf_age);
add(tf_job);
add(bt_submit);
add(bt_cancel);
setBounds(500,200,240,280);
//setVisible(true);
//setDefaultCloseOperation(EXIT_ON_CLOSE); //전체 '자바응용프로그램 종료' 의미
}//생성자
}//InputForm
- Control
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;
import com.encore.person.model.Model;
import com.encore.person.model.Person;
import com.encore.person.view.InputForm;
import com.encore.person.view.MainView;
import com.encore.person.view.UpForm;
public class Controller implements ActionListener{
//ActionListener상속한 이유? 뷰내의 버튼의 눌림(액션)을 체크하기 위해서!!
//전체뷰등록
MainView mainView;
InputForm form;
UpForm upForm;
//모델 등록 (Vector<Person>등록)
Model m;
public Controller() {
mainView = new MainView();
form = new InputForm();
upForm = new UpForm();
m = new Model();
eventUp();
}//생성자
private void eventUp() {//이벤트 소스 등록
/////////// MainView이벤트 소스 ////////////////
mainView.bt_insert.addActionListener(this);
mainView.bt_update.addActionListener(this);
mainView.bt_del.addActionListener(this);
mainView.bt_exit.addActionListener(this);
/////////// InputForm이벤트 소스 ////////////////
form.bt_submit.addActionListener(this);
form.bt_cancel.addActionListener(this);
form.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//입력폼 ----> 메인뷰 이동
form.setVisible(false);
mainView.setVisible(true);
}
});
/////////// UpForm이벤트 소스 ////////////////
upForm.bt_submit.addActionListener(this);
upForm.bt_cancel.addActionListener(this);
upForm.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//수정폼 ----> 메인뷰 이동
upForm.setVisible(false);
mainView.setVisible(true);
}
});
}//eventUp
@Override
public void actionPerformed(ActionEvent e) {//기능정의 메소드: 이벤트 핸들러
Object ob = e.getSource();
if(ob==mainView.bt_insert) {//[1]메인뷰: 입력요청 (데이터 입력을 위한 폼이동)
mainView.setVisible(false);
form.setVisible(true);
}
else if(ob==mainView.bt_update) {//[1]메인뷰: 수정요청 (데이터 수정을 위한 폼이동)
int row = mainView.table.getSelectedRow();
int no = Integer.parseInt(mainView.table.getValueAt(row, 0).toString());
//JTable에서 선택된 행의 번호 얻기
Person oldp = m.select(no);//no를 조건으로 벡터에 일치하는 Person 얻어오기
//oldp : 벡터에 이미 저장되어있는 Person
// ----> 수정폼(TextField)에 출력
upForm.tf_name.setText(oldp.getName());
upForm.tf_age.setText(oldp.getAge()+"");
upForm.tf_job.setText(oldp.getJob());
//나중에 수정을 위해 UpForm 멤버 upNo에 번호 저장
upForm.upNo = oldp.getNo();
mainView.setVisible(false);
upForm.setVisible(true);
}
else if(ob==mainView.bt_del) {//[1]메인뷰: 삭제요청
}
else if(ob==mainView.bt_exit) {//[1]메인뷰: 프로그램 종료요청
}
else if(ob==form.bt_submit) {
//[1]입력폼뷰: 입력요청 (폼에 입력된 데이터를 Vector에 저장)
String name = form.tf_name.getText();
int age = Integer.parseInt(form.tf_age.getText());
String job = form.tf_job.getText();
Person p = new Person(0, name, age, job);
m.insert(p);
//추가된 내용을 JTable에 반영
Vector<Person> personv = m.selectAll();
mainView.displayTable(personv);
//메인뷰로 이동
form.setVisible(false);
mainView.setVisible(true);
}
else if(ob==upForm.bt_submit) {
//[1]수정폼뷰: 수정요청 (폼에 입력된 데이터를 정보로 Vector에 값을 변경)
int age = Integer.parseInt(upForm.tf_age.getText());
String job = upForm.tf_job.getText();
//Person p = new Person(0, null, age, job);
Person p = new Person();
p.setAge(age);
p.setJob(job);
p.setNo(upForm.upNo);
m.update(p);
//수정된 내용을 JTable에 반영
Vector<Person> personv = m.selectAll();
mainView.displayTable(personv);
//메인뷰로 이동
upForm.setVisible(false);
mainView.setVisible(true);
}
}//actionPerformed
public static void main(String[] args) {
new Controller();
}
}
'클라우드 기반 웹 개발자 과정 공부 > JAVA' 카테고리의 다른 글
190507 복습, 스레드, 수정 필요 (0) | 2019.05.07 |
---|---|
190503_Day19 복습, MVC다른방법, IO (0) | 2019.05.03 |
190430_Day17 숫자야구게임, Swing (0) | 2019.04.30 |
190429_Day16 복습, Swing (0) | 2019.04.29 |
190426_Day15 복습, 이벤트 처리 (0) | 2019.04.26 |