오늘은 이벤트 리스너와 도서 정보 관리 시스템에 대해 배우게 되었습니다!
Event Programming EventListener
- 이미지나 버튼을 변화시키는 것
1번째 방법
- JFrame 클래스(현재 클래스)에 EventHandler 클래스
- 추상 메소드 actionPerformed
- btn와 actionPerformed를 연결할 때 addActionListener를 이용
- 연결 버튼이 클릭이 되면 actionPerformed이 호출
package gui;
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
//JFrame 클래스
import javax.swing.JLabel;
import javax.swing.JPanel;
public class JFrameTest2 extends JFrame implements ActionListener {
// JPanel 만들기
ImageIcon icon = new ImageIcon("imgs/yeonJun.jpg");
JLabel lb1 = new JLabel(icon, JLabel.CENTER);
JPanel pan = new JPanel();
//버튼만들기
JButton btn1 = new JButton("Ive");
JButton btn2 = new JButton("Tomorrow by Together");
JButton btn3 = new JButton("Black Pink");
public JFrameTest2() {
btn1.addActionListener(this); // 현재 클래스 값
btn2.addActionListener(this);
btn3.addActionListener(this);
pan.add(btn1);
pan.add(btn2);
pan.add(btn3);
add(pan, "North"); // 꼭 대문자로 스기
add(lb1, "Center");
setTitle("JFrame 상속 연습"); // JFrame. 필요없음 -> 상속받았기 때문
setDefaultCloseOperation(EXIT_ON_CLOSE); // 무조건 있어야함 끝내는것
setLocation(200, 200); // x, y 좌표 /위치
setSize(500, 300); // 너비 높이 길이 설정 /크기
setVisible(true);
}
public static void main(String args[]) {
new JFrameTest2();
}
@Override
public void actionPerformed(ActionEvent e) {
JButton btnSource = (JButton) e.getSource(); //JButton으로 형변환하기
//위랑 똑같은 내용 Object btnSource = e.getSource();
if(btnSource == btn1) {
icon = new ImageIcon("imgs/ive.jpg");
}else if(btnSource == btn2) {
icon = new ImageIcon("imgs/TXT.jpg");
}else {
icon = new ImageIcon("imgs/bp.jpg");
}
lb1.setIcon(icon);
}
}
2번째 방법
- Inner(내부)클래스로 ActionListener를 구현
- 클래스안에 BtnListener를 만들고 그 참조값을 addActionListener에 추가해주기
package gui.test;
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
//JFrame 클래스
import javax.swing.JLabel;
import javax.swing.JPanel;
//2. Inner(내부)클래스로 ActionListener를 구현
public class JFrameTest3 extends JFrame {
// JPanel 만들기
ImageIcon icon = new ImageIcon("imgs/yeonJun.jpg");
JLabel lb1 = new JLabel(icon, JLabel.CENTER);
JPanel pan = new JPanel();
// 버튼만들기
JButton btn1 = new JButton("Ive");
JButton btn2 = new JButton("Tomorrow by Together");
JButton btn3 = new JButton("Black Pink");
public JFrameTest3() {
BtnListener btnListener = new BtnListener(); //내부클래스에서 만든 BtnListener와 연결됨
btn1.addActionListener(btnListener); // 현재 클래스 값
btn2.addActionListener(btnListener);
btn3.addActionListener(btnListener);
pan.add(btn1);
pan.add(btn2);
pan.add(btn3);
add(pan, "North"); // 꼭 대문자로 스기
add(lb1, "Center");
setTitle("JFrame 상속 연습"); // JFrame. 필요없음 -> 상속받았기 때문
setDefaultCloseOperation(EXIT_ON_CLOSE); // 무조건 있어야함 끝내는것
setLocation(200, 200); // x, y 좌표 /위치
setSize(500, 300); // 너비 높이 길이 설정 /크기
setVisible(true);
}
public static void main(String args[]) {
new JFrameTest3();
}
// 내부 클래스, 현재 클래스안에다가 BtnListener를 구현한 것
public class BtnListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) { //actionPerformed가 발생할
JButton btnSource = (JButton) e.getSource(); // JButton으로 형변환하기
// 위랑 똑같은 내용 Object btnSource = e.getSource();
if (btnSource == btn1) {
icon = new ImageIcon("imgs/ive.jpg");
} else if (btnSource == btn2) {
icon = new ImageIcon("imgs/TXT.jpg");
} else {
icon = new ImageIcon("imgs/bp.jpg");
}
lb1.setIcon(icon);
}
}
}
3번째 방법
- Anonymous(익명) 클래스로 ActionListener를 구현
- 클래스 이름이 없고 new ActionListener를 상속 받아서 이름없이 클래스를 구현(객체 생성됨) 이걸 버튼과 연결
package gui.test;
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
//JFrame 클래스
import javax.swing.JLabel;
import javax.swing.JPanel;
//3. Anonymous(익명) 클래스로 ActionListener를 구현
public class JFrameTest4 extends JFrame {
// JPanel 만들기
ImageIcon icon = new ImageIcon("imgs/yeonJun.jpg");
JLabel lb1 = new JLabel(icon, JLabel.CENTER);
JPanel pan = new JPanel();
// 버튼만들기
JButton btn1 = new JButton("Ive");
JButton btn2 = new JButton("Tomorrow by Together");
JButton btn3 = new JButton("Black Pink");
public JFrameTest4() {
//BtnListener btnListener = new BtnListener(); //내부클래스에서 만든 BtnListener와 연결됨
btn1.addActionListener(btnListener); // 현재 클래스 값
btn2.addActionListener(btnListener);
btn3.addActionListener(btnListener);
pan.add(btn1);
pan.add(btn2);
pan.add(btn3);
add(pan, "North"); // 꼭 대문자로 스기
add(lb1, "Center");
setTitle("JFrame 상속 연습"); // JFrame. 필요없음 -> 상속받았기 때문
setDefaultCloseOperation(EXIT_ON_CLOSE); // 무조건 있어야함 끝내는것
setLocation(200, 200); // x, y 좌표 /위치
setSize(500, 300); // 너비 높이 길이 설정 /크기
setVisible(true);
}
public static void main(String args[]) {
new JFrameTest4();
}
ActionListener btnListener = new ActionListener() { //익명 클래스 객체 , when 간단한 리스너, 안드로이드
@Override
public void actionPerformed(ActionEvent e) {
JButton btnSource = (JButton) e.getSource(); // JButton으로 형변환하기
// 위랑 똑같은 내용 Object btnSource = e.getSource();
if (btnSource == btn1) {
icon = new ImageIcon("imgs/ive.jpg");
} else if (btnSource == btn2) {
icon = new ImageIcon("imgs/TXT.jpg");
} else {
icon = new ImageIcon("imgs/bp.jpg");
}
lb1.setIcon(icon);
}
};
}
4번째 방법
- 독립된 ActionListener 클래스를 사용하자(콜바이 래퍼런스)
- Listener를 독립시켜준다 ActionListener라는 상속을 받음 → implements ActionListener
- 3개의 참조값 전달(버튼많아지면 배열로 만들어주기 리스너객체에 전달 )
- 독립된 클래스 만들기 (객체 생성해서 addActionListener로 연결)
package gui.test;
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
//JFrame 클래스
import javax.swing.JLabel;
import javax.swing.JPanel;
//4. 독립된 ActionListener 클래스를 사용하자
public class JFrameTest5 extends JFrame {
// JPanel 만들기
ImageIcon icon = new ImageIcon("imgs/yeonJun.jpg");
JLabel lb1 = new JLabel(icon, JLabel.CENTER);
JPanel pan = new JPanel();
// 버튼만들기
JButton btn1 = new JButton("Ive");
JButton btn2 = new JButton("Tomorrow by Together");
JButton btn3 = new JButton("Black Pink");
public JFrameTest5() {
ButtonListener btnListener = new ButtonListener(btn1, btn2, lb1); //ButtonListener에서 만든 객체를 리스너에게 전달하기
btn1.addActionListener(btnListener); // 현재 클래스 값
btn2.addActionListener(btnListener);
btn3.addActionListener(btnListener);
pan.add(btn1);
pan.add(btn2);
pan.add(btn3);
add(pan, "North"); // 꼭 대문자로 스기
add(lb1, "Center");
setTitle("JFrame 상속 연습"); // JFrame. 필요없음 -> 상속받았기 때문
setDefaultCloseOperation(EXIT_ON_CLOSE); // 무조건 있어야함 끝내는것
setLocation(200, 200); // x, y 좌표 /위치
setSize(500, 300); // 너비 높이 길이 설정 /크기
setVisible(true);
}
public static void main(String args[]) {
new JFrameTest5();
}
}
package gui.test;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
public class ButtonListener implements ActionListener {
JButton btn1, btn2;
JLabel lb1;
public ButtonListener(JButton btn1, JButton btn2, JLabel lb1) {
super();
this.btn1 = btn1;
this.btn2 = btn2;
this.lb1 = lb1;
}
//콜바이 래퍼런스
@Override
public void actionPerformed(ActionEvent e) {
ImageIcon icon = null; //지역변수 선언
JButton btnSource = (JButton) e.getSource(); // JButton으로 형변환하기
// 위랑 똑같은 내용 Object btnSource = e.getSource();
if (btnSource == btn1) {
icon = new ImageIcon("imgs/ive.jpg");
} else if (btnSource == btn2) {
icon = new ImageIcon("imgs/TXT.jpg");
} else {
icon = new ImageIcon("imgs/bp.jpg");
}
lb1.setIcon(icon);
}
}
< 도서 정보 관리 시스템 >
MVC 모델링
- M
- DataModel(BookVO, BookDAO)
- V
- View(BookView)
- C
- Controller(BookController)
- 입력 (콘솔) : 도서정보 (BookVO)
- →여러 책의 정보들 → ArrayList(BookVO객체들) / 저장 반환 →BookDAO
- isbn(도서번호), bookName(책이름), author(저자명), publish(출판사), price(가격), category(카테고리) → 6개 필드
- 출력 : 저장된 도서 정보들을 콘솔창에 출력
→BookVO
package info.vo;
public class BookVO {
private int isbn; //도서번호
private String bookName; //책이름
private String author; //저자명
private String publish; //출판사
private double price; //가격
private String category; //카테로기
//생성자 : 필드값 초기화
public BookVO() {
}
public BookVO(int isbn, String bookName, String author, String publish, double price, String category) {
super();
this.isbn = isbn;
this.bookName = bookName;
this.author = author;
this.publish = publish;
this.price = price;
this.category = category;
}
public int getIsbn() {
return isbn;
}
public void setIsbn(int isbn) {
this.isbn = isbn;
}
public String getbookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublish() {
return publish;
}
public void setPublish(String publish) {
this.publish = publish;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
@Override
public String toString() {
return "BookVO [isbn=" + isbn + ", bookName=" + bookName + ", author=" + author + ", publish=" + publish
+ ", price=" + price + ", category=" + category + "]";
}
}
→BookDAO
package info.vo;
import java.util.ArrayList;
public class BookDAO {
//ArrayList 만들기
ArrayList<BookVO> bookList = new ArrayList();
//insert : ArrayList에 학생정보객체를 추가하는 메소드
public void insert(BookVO book) {
bookList.add(book);
}
//select : 전체 책 정보를 반환해주기
public ArrayList<BookVO> select() {
return bookList;
}
}
→ BookController
package info.controller;
import java.util.ArrayList;
import java.util.Scanner;
import info.view.BookView;
import info.vo.BookDAO;
import info.vo.BookVO;
public class BookController {
public static final int CONTINUE = 1;
public static final int BREAK = 0;
// ArrayList 에 추가하기
ArrayList<Integer> isbns = new ArrayList<Integer>();
ArrayList<String> bookNames = new ArrayList<String>();
ArrayList<String> authors = new ArrayList<String>();
ArrayList<String> publishes = new ArrayList<String>();
ArrayList<Double> prices = new ArrayList<Double>();
ArrayList<String> categories = new ArrayList<String>();
public void consoleToList() {
Scanner s1 = new Scanner(System.in); // 문자용 입력
Scanner s2 = new Scanner(System.in); // 숫자용 입력
int flag = CONTINUE;
System.out.println("********** 도서 정보 입력 **********");
while (true) {
if (flag == CONTINUE) {
System.out.print("==도서 번호 입력 : ");
isbns.add(s2.nextInt());
System.out.print("==책 이름 입력 : ");
bookNames.add(s1.nextLine());
System.out.print("==저자 입력 : ");
authors.add(s1.nextLine());
System.out.print("==출판사 입력 : ");
publishes.add(s1.nextLine());
System.out.print("==가격 입력 : ");
prices.add(s2.nextDouble());
System.out.print("==카테고리 입력 : ");
categories.add(s1.nextLine());
System.out.println(" ");
} else if (flag == BREAK) {
break;
} else {
System.out.println("다시 입력해주세요 : ");
flag = s2.nextInt();
}
System.out.println("도서 정보를 더 입력하실건가요? (계속 : 1, 중지 : 0) : ");
flag = s2.nextInt();
}
s1.close();
s2.close();
}
public void voToDAO(BookDAO dao) {
for (int i = 0; i < isbns.size(); i++) {
BookVO book = new BookVO(isbns.get(i), bookNames.get(i), authors.get(i), publishes.get(i), prices.get(i),
categories.get(i));
dao.insert(book);
}
}
public static void main(String args[]) {
BookController controller = new BookController();
// controller에 consoleToList에 입력받은 값들을 넣기
controller.consoleToList();
BookDAO dao = new BookDAO();
controller.voToDAO(dao);
// 화면에 출력
BookView bView = new BookView();
bView.view(dao.select());
}
}
→ BookView
package info.view;
import java.util.ArrayList;
import info.vo.BookVO;
public class BookView {
public void view(ArrayList<BookVO> bookList) {
for(BookVO book : bookList) {
System.out.println("======================================================================================");
System.out.print("도서 번호 : " + book.getIsbn() + "\t");
System.out.print("책 이름 : " + book.getbookName() + "\t");
System.out.print("저자명 : " + book.getAuthor() + "\t");
System.out.print("출판사 : " + book.getPublish() + "\t");
System.out.print("가격 : " + book.getPrice() +"원" + "\t");
System.out.print("카테고리 : " + book.getCategory() + "\n");
System.out.println("--------------------------------------------------------------------------------------");
}
}
}
결과
GUI로 변환하기
javax.swing.JTable
- 행, 열로 data를 출력하는 컴포넌트
javax.swing.JTextField
- 값 입력 컴포넌트
javax.swing.JCombobox
- 콤보박스 컴포넌트
GridLayout(표 같은 느낌)(4, 4) (행, 열)
Empty String : “ “ 빈 문자열
JPanel를 이용하여 추가
-GridLayout
도서번호 : | TextField | 도서명 : | TextField |
출판사 : | TextField | 저자명 : | TextField |
도서가격 : | TextField | 카테고리 : | Combobox |
EmptyString | 도서추가 |
JFrame : BorderLayout (다섯개의 구역)
- 창역할
- 그 안에 넣는 작은 역할이 JPanel
JPanel : FlowLayout(자연스럽게, 저절로 flow)
→ BookController2
package info.controller;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import info.view.BookView2;
import info.vo.BookDAO;
import info.vo.BookVO;
public class BookController2 extends JFrame {
BookDAO dao;
ArrayList<BookVO> bookVOLIst;
BookView2 view2;
public BookController2() {
dao = new BookDAO();
view2 = new BookView2();
bookVOLIst = dao.select();
view2.setBookVOList(bookVOLIst);
view2.initView(); //initView호출
JButton btnAdd = view2.getBtnAdd(); //view만들어져 있는 버튼 반환해서 사용하기
btnAdd.addActionListener(btnAddL); //버튼을 클릭했을때
add(view2, "Center"); //view2의 가운데에 추가
setTitle("도서 관리 시스템");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocation(200, 100);
setSize(600, 500);
setVisible(true);
}
public static void main(String[] args) {
new BookController2();
}
ActionListener btnAddL = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//neededInsertData() : panS에 있는 JTextField에 입력된 값들과 JCombobox의 값
//BookVO에 필드값들을 초기화하여 BookVO 객체에 참조값을 변환하는 메소드
BookVO vo = view2.neededInsertData();
dao.insert(vo);
bookVOLIst = dao.select();
view2.setBookVOList(bookVOLIst);//bookVOLIst를 다시 view에 넣어주기
view2.putResult();
view2.initInsertData(); //(사용자의 편리를 위한것) 기존의 입력됐던 값들을 처음으로 초기화시켜줌
}
};
}
→BookView2
package info.view;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import info.vo.BookVO;
public class BookView2 extends JPanel {
JTable table;
DefaultTableModel model; // DfaultTableModel이 같이 필요함
ArrayList<BookVO> bookVOList;
String header[] = { "도서 번호", "도서명", "출판사", "저자명", "도서가격", "카테고리" };
String categoryNames[] = { "IT도서", "소설", "비도서", "경제", "사회" };
// 패널 선언
JPanel panS;
JComboBox<String> categoryCombo;
JLabel lbls[] = new JLabel[header.length]; // 참조형 변수 선언
JTextField tf[] = new JTextField[header.length - 1]; // JTextfield 5개 필요 카테고리 하나 빼서
// 버튼 추가
JButton btnAdd = new JButton("도서추가");
// 생성자
public BookView2() {
setLayout(new BorderLayout()); // JPanel의 기본적인 대치관리자는 FlowLayout인데 BorderLayout을 사용하기 위해 바꿈
categoryCombo = new JComboBox<String>(categoryNames); //
panS = new JPanel();
panS.setLayout(new GridLayout(4, 4)); // 행, 열
for (int i = 0; i < header.length; i++) {
lbls[i] = new JLabel(header[i]);
panS.add(lbls[i]); // 구역이 나눠진 panS에 라벨 넣기
if (i < header.length - 1) { // i가 4일때까지 0 1 2 3 4
tf[i] = new JTextField();
panS.add(tf[i]);
} else {// i가 5가 됐을때 카테고리 콤보 넣어주기
panS.add(categoryCombo);
}
}
// 도서추가 앞에 빈칸 3개 추가
for (int i = 0; i < 3; i++) {
panS.add(new JLabel(" "));
}
// 버튼 추가
panS.add(btnAdd);
}
// initView(): JTable 관련 메소드
public void initView() {
model = new DefaultTableModel(header, bookVOList.size()) { // 편집이 됨
// isCell 단축키
@Override
public boolean isCellEditable(int row, int column) { // 패널에 저장되어 있는
return false; // 편집안됨
}
};
// 컬럼들의 너비 설정
table = new JTable(model);
table.getColumnModel().getColumn(0).setPreferredWidth(50);
table.getColumnModel().getColumn(1).setPreferredWidth(200);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(4).setPreferredWidth(50);
table.getColumnModel().getColumn(5).setPreferredWidth(50);
// 스크로바 만들기
JScrollPane scroll = new JScrollPane(table);
putResult();
add("Center", scroll); // 위치 순서 상관없음
add("South", panS);
}
// DefaultTableModel에 도서 정보들을 설정한다.
public void putResult() { //결과의 값들 잘 설정되도록
// ** modelml 행 개수 설정
model.setRowCount(bookVOList.size()); // 화면에 나오게 하는것 중요
// 지역변수 선언
BookVO vo = null;
for (int i = 0; i < bookVOList.size(); i++) {
vo = bookVOList.get(i);
// i : 행 번호 0 : 열번호
// 값을 설정한다 sell값을 설정하는 메소드
model.setValueAt(vo.getIsbn(), i, 0);
model.setValueAt(vo.getbookName(), i, 1);
model.setValueAt(vo.getPublish(), i, 2);
model.setValueAt(vo.getAuthor(), i, 3);
model.setValueAt(vo.getPrice(), i, 4);
model.setValueAt(vo.getCategory(), i, 5);
}
}
public void setBookVOList(ArrayList<BookVO> bookVOList) { // 단축키 사용가능
this.bookVOList = bookVOList;
}
public JButton getBtnAdd() {
return btnAdd;
}
public BookVO neededInsertData() {
BookVO vo = new BookVO();
vo.setIsbn(Integer.parseInt(tf[0].getText()));
vo.setBookName(tf[1].getText());
vo.setPublish(tf[2].getText());
vo.setAuthor(tf[3].getText());
vo.setPrice(Integer.parseInt(tf[4].getText()));
vo.setCategory((String) categoryCombo.getSelectedItem());
return vo; //vo를 return
}
public void initInsertData() {
for (int i = 0; i < tf.length; i++) {
tf[i].setText("");
}
categoryCombo.setSelectedIndex(0);
}
}
결과
'AfterSchool > 자바 방과후' 카테고리의 다른 글
Vending machine GUI로 만들기(1231) (2) | 2023.01.03 |
---|---|
깃허브 쓰는법, Vending Machine 로직소스 만들기(1230) (0) | 2022.12.30 |
성적프로그램과 BMI프로그램 만들기(1229) (0) | 2022.12.29 |
상속 예제와 JFrame 사진 넣고 버튼 누르면 이미지 변환(1227) (0) | 2022.12.27 |
MVC 모델, ArrayList, 오버라이딩 기초를 배워서 학생 정보 관리 시스템 만들기(1226) (0) | 2022.12.26 |