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();
    }

}

+ Recent posts