본문 바로가기
학원수업/1월

01/13 국비학원 35회차 오라클(도서관리시스템)

by 코딩마스터^^ 2023. 1. 13.

생성자 클래스 쪼개기 

-MVC

-Pojo

-Flow

-Spring

 

메인메소드안에서는 내안에 있는것이라도 인스턴스화 해야한다.

 

질문

JFrame하나에서 JPanel만 3개를 돌려가며 바꾸고싶다.

package dev_java2.week7;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class KiwiApp extends JFrame implements ActionListener {
    String imgPath="D:\\vscode_java\\dev_java\\images\\";
    Image img[]=null;
    ImageIcon imgs[] = new ImageIcon[3];
    String imgNames[] = {"admin2.png", "delay.png", "broken2.png"};

    JPanel jp_south=new JPanel();
    JPanel jp_center=new JPanel();
    JButton jbtn1 = new JButton();
    JButton jbtn2 = new JButton();
    JButton jbtn3 = new JButton();
    JButton imgButton[] = {jbtn1,jbtn2,jbtn3};
    Container conn= this.getContentPane();
    //컨테이너클래스는 JFrame에서만 주입 받을 수 있음
    //JPanel에서는 생성 불가함
    //생성자 파라미터를 통해서 넘겨서 사용함

    KiwiPanel1  kp1=null;
    KiwiPanel2 kp2=null;
    KiwiPanel3 kp3=null;
  public KiwiApp() {}
    public void initDisplay() {
        jbtn1.addActionListener(this);
        jbtn2.addActionListener(this);
        jbtn3.addActionListener(this);
        jp_center.setBackground(Color.CYAN);
        jp_south.setLayout(new GridLayout(1, 3));
        for(int i=0; i<imgs.length;i++){
            imgs[i]=new ImageIcon(imgPath+imgNames[i]);
            imgButton[i].setIcon(imgs[i]);
            imgButton[i].setBorderPainted(false);
            imgButton[i].setFocusPainted(false);
            imgButton[i].setContentAreaFilled(false);
            jp_south.add(imgButton[i]);
        }
        jp_south.add(jbtn1);
        jp_south.add(jbtn2);
        jp_south.add(jbtn3);
        this.add("South", jp_south);
        this.add("Center", jp_center);
        this.setSize(400, 500);
        this.setVisible(true);
    }
    public static void main(String[] args) {
        KiwiApp kApp = new KiwiApp();
        kApp.initDisplay();
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj = e.getSource();
        //너 첫번째 버튼 누른거야?
        if(obj == jbtn1) {
            System.out.println("첫번째");
            if(kp2!=null){
//                conn.remove(kp2.jta);
//                conn.remove(kp2.jtf);
                conn.remove(kp2);
            }
            if(kp3!=null){
                conn.remove(kp3.jsp);
                conn.remove(kp3);
            }
            kp1=new KiwiPanel1();
            this.add("Center",kp1);
            conn.revalidate();//화면 재조정
        }else if(obj == jbtn2) {//두번째 버튼 누른거야?
            System.out.println("두번째");
            if(kp1!=null){
//                conn.remove(kp1.jbtn1);
//                conn.remove(kp1.jbtn2);
//                conn.remove(kp1.jbtn3);
                conn.remove(kp1);
            }
            if(kp3!=null){
//                conn.remove(kp3.jsp);
                conn.remove(kp3);
            }
            kp2=new KiwiPanel2();
            this.add("Center",kp2);
            conn.revalidate();//화면 재조정
        }else if (obj == jbtn3) {//세번째 버튼 원해?

            System.out.println("세번째");
            if(kp1!=null){
                conn.remove(kp1.jbtn1);
                conn.remove(kp1.jbtn2);
                conn.remove(kp1.jbtn3);
                conn.remove(kp1);
            }
            if(kp2!=null){
                conn.remove(kp2.jta);
                conn.remove(kp2.jtf);
                conn.remove(kp2);
            }
            kp3=new KiwiPanel3();
            this.add("Center",kp3);
            conn.revalidate();//화면 재조정
        }
    }
}

 

 

package dev_java2.week7;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class KiwiPanel1 extends JPanel implements ActionListener {
    //이른 인스턴스화로 할까? 아님 게으른인스턴스화로 할까?
    //생성자는 필요한가?
    //생성자가 필요하다고 생각했다면 KiwiPanel1
    //필요하다고 생각했다면 어떤 타입이 왜 와야하는지 말할 수있다.


    KiwiApp kApp = null;
    JButton jbtn1= new JButton("소연");
    JButton jbtn2= new JButton("도희");
    JButton jbtn3= new JButton("은재");
    //반드시 static 으로 해야하는 이유는 패널 1번에서 결정되 설정이 패널 2에도, 또 패널 3에도 적용되어야 하니까.
    static Font f =null;
    static boolean isSize = false;
    public KiwiPanel1(){
        initDisplay();
    }
    public void initDisplay(){
        this.setLayout(null);
        jbtn1.addActionListener(this);
        jbtn2.addActionListener(this);
        jbtn3.addActionListener(this);
        jbtn1.setBounds(140, 80, 100, 30);
        jbtn2.setBounds(140, 150, 100, 30);
        jbtn3.setBounds(140, 220, 100, 30);
        this.add(jbtn1);
        this.add(jbtn2);
        this.add(jbtn3);
    }

    public static void main(String[] args) {
        KiwiPanel1 kp1 = new KiwiPanel1();
        kp1.initDisplay();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    if(e.getSource() == jbtn3){
        if(!isSize){
            f=new Font("굴림체", Font.BOLD,16);
            jbtn1.setFont(f);
            jbtn2.setFont(f);
            jbtn3.setFont(f);
            isSize = true;
        }else{
            f=new Font("굴림체", Font.PLAIN,16);
            jbtn1.setFont(f);
            jbtn2.setFont(f);
            jbtn3.setFont(f);
            isSize = false;
        }
    }
    }
    /*
    생성자 안에서 initDisplay()를 호출하는것과 그렇지 않은것의 차이는 뭘까?
    위치의 문제이면 화면 정의서의 요구사항에 따라서 다른 선택이 되어야한다.

     */

}

 

package dev_java2.week7;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class KiwiPanel2 extends JPanel implements ActionListener {
    KiwiApp kiwiApp=null;
    JTextArea jta=new JTextArea("");
    JTextField jtf=new JTextField("");
    //이른 인스턴스화로 할까? 아님 게으른이로 할까?
    //생성자는 필요한가?
    //생성자가 필요하다고 생각했다면 KiwiPanel1
    //필요하다고 생각했다면 어떤 타입이 왜 와야하는지 말할 수있다.
    public KiwiPanel2(){
        initDisplay();
    }
    public KiwiPanel2(KiwiApp kiwiApp){
        this();//15번 자기자신 생성자 호출하기.
        this.kiwiApp=kiwiApp;
    }
    public void ChangeFontSize(){
        jta.setFont(KiwiPanel1.f);
        jtf.setFont(KiwiPanel1.f);
    }
    public void initDisplay(){
        if(KiwiPanel1.isSize){
            ChangeFontSize();
        }
      this.setLayout(new BorderLayout());
      this.add("Center",jta);
      this.add("South",jtf);
      this.setSize(400,400);
        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }

}

 

package dev_java2.week7;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class KiwiPanel3 extends JPanel implements ActionListener {
    String header[]={"부서번호","부서명","지역"};
//    String datas[][]=new String[0][3];
    String datas[][]={
        {"10","개발부", "서울"}
        ,{"20","인사부"," 부산"}
        ,{"30","부찌부","뉴욕"}
    };
    DefaultTableModel dtm = new DefaultTableModel(datas,header);//생성자 호출
    JTable jtb=new JTable(dtm);
    JScrollPane jsp=new JScrollPane(jtb, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    JTableHeader jth=jtb.getTableHeader();//헤더 크기 변경하기
    KiwiApp kiwiApp=null;
    public KiwiPanel3(){
        initDisplay();
    }
    public KiwiPanel3(KiwiApp kiwiApp){
        this();
        this.kiwiApp=kiwiApp;
    }
    public void ChangeFontSize(){
        jth.setFont(KiwiPanel1.f);
        jtb.setFont(KiwiPanel1.f);
    }
    public void initDisplay(){
        if(KiwiPanel1.isSize){
            ChangeFontSize();
        }
        //JPanel은 디폴트 레이아웃이 FlowLayout
        //JDialog, JFrame은 디폴트 레이아웃이 BorderLayout
        this.setLayout(new BorderLayout());
        this.add("Center",jsp);

        }

    @Override
    public void actionPerformed(ActionEvent e) {
    }



}

 

SQL응용

클래스 설계

MVC패턴 적용

MVC 는 Model, View, Controller의 약자 입니다. 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴입니다.

https://m.blog.naver.com/jhc9639/220967034588

 

[개발자 면접준비]#1. MVC패턴이란

오늘은 개발자면접에 많이 나오기도 하는 MVC패턴에 대해서 알아보고자 합니다. 과연 MVC패턴이 무엇...

blog.naver.com

 

도서관리시스템

 

DB설계

요구사항정의서

1.우리회사는 회원제로 운영됩니다.

2.회원은 소서를 주문하고 배송여부를 선택하여 결제를 진행한다.

3. 도서정보는 저자, 출판사, 출판일, 가격, 도서제목, 도서설명, 이미지

 

4. 주문까지만 구현해 본다.

5.도서정보는 입력, 수정, 삭제, 조회 기능을 제공한다.

 

 

?

테이블 지우기

drop table 테이블이름;

데이터를 지우기

delete는 데이터를 지우는것이다.

DDL은 커밋과 롤백의 대상이 아니다.

ERWin데이터 모듈러로 데이터를 만들어주었다.

토드로 데이터 내보내기

반드시 주의할점!

트리거 꼭 체크박스 다 해제해주기

 

 

도서관리 시스템 로직

 

댓글