package dev_java.week7;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.GridLayout;
import java.awt.Color;
import java.awt.Image;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class KiwiApp extends JFrame implements ActionListener {
String imgPath = "D:\\vscode_java\\dev_java\\app\\\\src\\main\\java\\dev_java\\images\\conn\\";
// Image img[] = null;
ImageIcon imgs[] = new ImageIcon[4];
String imgNames[] = { "admin.png", "broken.png", "delay.png", "point.png" };
JPanel jp_south = new JPanel();
JPanel jp_center = new JPanel();
JButton jbtn_1 = new JButton();
JButton jbtn_2 = new JButton();
JButton jbtn_3 = new JButton();
JButton jbtn_4 = new JButton();
JButton imgButton[] = { jbtn_1, jbtn_2, jbtn_3, jbtn_4 };
// 컨테이너 클래스는 JFrame에서만 주입받을 수 있음
// JPanel에서는 생성 불가
// 생성자 파라미터를 통해서 넘겨서 사용함
Container conn = this.getContentPane();
KiwiPanel1 kPanel1 = null;
KiwiPanel2 kPanel2 = null;
KiwiPanel3 kPanel3 = null;
public KiwiApp() {
}
public void initDisplay() {
jbtn_1.addActionListener(this);
jbtn_2.addActionListener(this);
jbtn_3.addActionListener(this);
jbtn_4.addActionListener(this);
jp_center.setBackground(Color.green);
jp_south.setLayout(new GridLayout(1, 4));
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]);
}
this.add("South", jp_south);
this.add("Center", jp_center);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
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 == jbtn_1) {
System.out.println("첫번째");
if (kPanel2 != null) {
// conn.remove(jp_center);
conn.remove(kPanel2.jta);
conn.remove(kPanel2.jtf);
conn.remove(kPanel2);
}
if (kPanel3 != null) {
// conn.remove(jp_center);
conn.remove(kPanel3.jsp);
conn.remove(kPanel3);
}
kPanel1 = new KiwiPanel1(this);
this.add("Center", kPanel1);
conn.revalidate();
}
// 두번째 버튼
else if (obj == jbtn_2) {
System.out.println("두번째");
if (kPanel1 != null) {
// conn.remove(jp_center);
conn.remove(kPanel1.jbtn_1);
conn.remove(kPanel1.jbtn_2);
conn.remove(kPanel1.jbtn_3);
conn.remove(kPanel1);
}
if (kPanel3 != null) {
// conn.remove(jp_center);
conn.remove(kPanel3.jsp);
conn.remove(kPanel3);
}
kPanel2 = new KiwiPanel2(this);
this.add("Center", kPanel2);
conn.revalidate();
}
// 세번째 버튼
else if (obj == jbtn_3) {
System.out.println("세번째");
if (kPanel1 != null) {
// conn.remove(jp_center);
conn.remove(kPanel1.jbtn_1);
conn.remove(kPanel1.jbtn_2);
conn.remove(kPanel1.jbtn_3);
conn.remove(kPanel1);
}
if (kPanel2 != null) {
// conn.remove(jp_center);
conn.remove(kPanel2.jta);
conn.remove(kPanel2.jtf);
conn.remove(kPanel2);
}
kPanel3 = new KiwiPanel3(this);
this.add("Center", kPanel3);
conn.revalidate();
}
// 네번째 버튼
// else if (obj == jbtn_4) {
// System.out.println("네번째");
// if (kPanel1 != null) {
// conn.remove(kPanel1.jbtn_1);
// conn.remove(kPanel1.jbtn_2);
// conn.remove(kPanel1.jbtn_3);
// conn.remove(kPanel1);
// }
// if (kPanel2 != null) {
// conn.remove(kPanel2.jta);
// conn.remove(kPanel2.jtf);
// conn.remove(kPanel2);
// }
// if (kPanel3 != null) {
// conn.remove(kPanel3.jsp);
// conn.remove(kPanel3);
// }
// this.add("Center", jp_center);
// conn.revalidate();
// }
}
}
package dev_java.week7;
import javax.swing.JButton;
import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Font;
public class KiwiPanel1 extends JPanel implements ActionListener {
// 이른 인스턴스화 혹은 게으른 인스턴스화?
// 생성자의 필요성? 파라미터는? 어떤타입?
KiwiApp kiwiApp = null;
JButton jbtn_1 = new JButton("배경화면");
JButton jbtn_2 = new JButton("글꼴");
JButton jbtn_3 = new JButton("글자크기");
// 반드시 static으로 해야하는 이유는 패널 1번에서 결정된 설정이 패널 2, 3에도 반영되어야 하기에
static Font f = null;
static boolean isSize = false;
public KiwiPanel1() {
initDisplay();
}
public KiwiPanel1(KiwiApp kiwiApp) {
this();
this.kiwiApp = kiwiApp;
}
public void initDisplay() {
jbtn_1.addActionListener(this);
jbtn_2.addActionListener(this);
jbtn_3.addActionListener(this);
this.setLayout(null);
jbtn_1.setBounds(140, 80, 100, 30);
jbtn_2.setBounds(140, 150, 100, 30);
jbtn_3.setBounds(140, 220, 100, 30);
this.add(jbtn_1);
this.add(jbtn_2);
this.add(jbtn_3);
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
// 배경화면
if (obj == jbtn_1) {
System.out.println("1번 클릭");
}
// 글꼴
else if (obj == jbtn_2) {
System.out.println("2번 클릭");
}
// 글자크기
else if (obj == jbtn_3) {
System.out.println("3번 클릭");
if (!isSize) {
f = new Font("굴림체", Font.BOLD, 16);
jbtn_1.setFont(f);
jbtn_2.setFont(f);
jbtn_3.setFont(f);
isSize = true;
} else {
f = new Font("굴림체", Font.PLAIN, 12);
jbtn_1.setFont(f);
jbtn_2.setFont(f);
jbtn_3.setFont(f);
isSize = false;
}
}
}
}
/*
* 생성자 안에서 inirDisplay()를 호출하는 것과 그렇지 않은 것의 차이는?
* 위치의 문제이며 화면정의서의 요구사항에 따라서 다른 선택이 되야함
*/
package dev_java.week7;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.awt.BorderLayout;
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("");
public KiwiPanel2() {
initDisplay();
}
public KiwiPanel2(KiwiApp kiwiApp) {
this(); // 자신의 디폴트 생성자 호출
this.kiwiApp = kiwiApp;
}
// 폰트 변경 메소드
public void changeFontSize() {
jta.setFont(KiwiPanel1.f);
jtf.setFont(KiwiPanel1.f);
}
public void initDisplay() {
if (KiwiPanel1.isSize) {
changeFontSize();
}
jtf.addActionListener(this);
this.setLayout(new BorderLayout());
this.add("Center", jta);
this.add("South", jtf);
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == jtf) {
jta.setText(jta.getText() + "\\n" + jtf.getText());
jtf.setText("");
}
}
}
package dev_java.week7;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.BorderLayout;
public class KiwiPanel3 extends JPanel implements ActionListener {
KiwiApp kiwiApp = null;
String header[] = { "부서번호", "부서명", "지역" };
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);
// JTable의 헤더 글자크기도 변경하기
JTableHeader jth = jtb.getTableHeader();
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) {
Object obj = e.getSource();
}
}
MVC패턴(Model-View-Controller)
애플리케이션을 세 가지 역할로 구분한 개발방법론
사용자가 Controller를 조작하면 Model을 통해 데이터를 가져오고, 그 데이터를 바탕으로 View를 통해 시각적 표현을 제어하여 사용자에게 전달
사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면의 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있음
도서관리시스템
DB설계
요구사항정의서
1. 회원제 운영
2. 회원은 도서를 주문하고 배송여부를 선택해 결제진행
3. 도서정보는 저자, 출판사, 출판일, 가격, 도서제목, 도서설명, 이미지
4. 주문까지 구현
5. 도서정보는 입력, 수정, 삭제, 조회 기능을 제공
drop table book;
drop table book_board;
drop table book_member;
--DDL은 commit과 rollback의 대상이 아님
SELECT * FROM book;
SELECT * FROM book_member;
SELECT * FROM book_board;
SELECT * FROM book_order;
'국비학원 > 수업기록' 카테고리의 다른 글
국비 지원 개발자 과정_Day37 (0) | 2023.01.17 |
---|---|
국비 지원 개발자 과정_Day36 (0) | 2023.01.16 |
국비 지원 개발자 과정_Day34 (0) | 2023.01.12 |
국비 지원 개발자 과정_Day33 (0) | 2023.01.11 |
국비 지원 개발자 과정_Day32 (0) | 2023.01.10 |
댓글