<Vending Machine> GUI로 만들기
1. 조건
- 제품이미지 다운로드 : project 폴더 - images 폴더에 저장
- View 및 Controller 수정
- 음료 JLable을 클릭 ⇒음료 이름과 금액이 대화상자에 나타나게 하고 확인 버튼을 클릭 ⇒ 금액 입력 ⇒ 투입버튼 클릭 ⇒ 00 제품 나옴 / 거스름돈 ~원
2-1) 먼저 3*3화면 만들어주기
package product.controller;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.JPanel;
import product.view.ProductView;
import product.vo.ProductDAO;
import product.vo.ProductVO;
public class ProductController extends JFrame {
ArrayList<ProductVO> proList; //필드로 선언해주기
public static final int STOP = 0;
public ProductController() {
ProductView view = new ProductView();
fullProduct(); //자판기 채우는걸 호출
view.setProductList(proList);
JPanel PanC = view.Output();
add(PanC, "Center");
setTitle("음료 자판기");
// 기본이 영어로 default 닫기 close 연산 operation
setDefaultCloseOperation(EXIT_ON_CLOSE);
// setLocation(100, 50);
// setSize(600, 600);
setBounds(100, 50, 600, 600);
setVisible(true); //맨마지막에 있기
}
public void fullProduct() {
// 자판기에 제품 채우기
ProductDAO dao = new ProductDAO();
String names[] = { "coca", "cocopap", "grape", "masil", "milkis", "powerade", "orange juice", "sichec", "sida"};
int[] prices = { 800, 900, 1100, 1100, 1500, 1600, 2000, 1000, 700 };
ProductVO vo = null;
proList = dao.select();
for (int i = 0; i < names.length; i++) {
vo = new ProductVO();
vo.setProName(names[i]);
//vo.setPrice(prices[i]);
//vo.setProductNum(i);
vo.setAmount(10);
vo.setImageName(names[i]);
proList.add(vo);
}
}
public static void main(String[] args) {
new ProductController();
}
}
package product.view;
import java.awt.GridLayout;
import java.util.ArrayList;
import javax.swing.*;
import product.vo.ProductVO;
public class ProductView {
ArrayList<ProductVO> proList; // proList ArrayList선언
ArrayList<JLabel> lblList = new ArrayList<JLabel>();
// 제품을 보여주는 화면
public JPanel Output() { //displayProducts
JPanel panC = new JPanel(new GridLayout(3,3));
for (ProductVO vo : proList) {
ImageIcon icon = new ImageIcon("imgs/" + vo.getImageName() + ".png");
JLabel lbl = new JLabel(icon);
lblList.add(lbl);
panC.add(lbl);
}
return panC;
}
// 제품을 입력(구매)하는 화면
public void Input() { //inputPurchase
}
public void setProductList(ArrayList<ProductVO> proList) {
this.proList = proList;
}
}
이렇게 만들게 되면
이런식으로 나오게 됩니당
2-2) 금액 투입버튼 만들어주기
package product.controller;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.JPanel;
import product.view.ProductView;
import product.vo.ProductDAO;
import product.vo.ProductVO;
public class ProductController extends JFrame {
ArrayList<ProductVO> proList; //필드로 선언해주기
public static final int STOP = 0;
public ProductController() {
//JFrame 배경색 변경
ProductView view = new ProductView();
fullProduct(); //자판기 채우는걸 호출
view.setProductList(proList);
JPanel PanC = view.Output();
JPanel panS= view.Input();
add(PanC, "Center"); //자판기 모양 가운데 에 넣기
add(panS, "South"); //금액 투입부분 south에 넣기
setTitle("음료 자판기");
// 기본이 영어로 default 닫기 close 연산 operation
setDefaultCloseOperation(EXIT_ON_CLOSE);
// setLocation(100, 50);
// setSize(600, 600);
setBounds(100, 20, 600, 600);
setVisible(true); //맨마지막에 있기
}
public void fullProduct() {
// 자판기에 제품 채우기
ProductDAO dao = new ProductDAO();
String names[] = { "coca", "cocopap", "grape", "masil", "milkis", "powerade", "orange juice", "sichec", "sida"};
int[] prices = { 800, 900, 1100, 1100, 1500, 1600, 2000, 1000, 700 };
ProductVO vo = null;
proList = dao.select();
for (int i = 0; i < names.length; i++) {
vo = new ProductVO();
vo.setProName(names[i]);
//vo.setPrice(prices[i]);
//vo.setProductNum(i);
vo.setAmount(10);
vo.setImageName(names[i]);
proList.add(vo);
}
}
public static void main(String[] args) {
new ProductController();
}
}
package product.view;
import java.awt.GridLayout;
import java.util.ArrayList;
import javax.swing.*;
import product.vo.ProductVO;
public class ProductView {
ArrayList<ProductVO> proList; // proList ArrayList선언
ArrayList<JLabel> lblList = new ArrayList<JLabel>();
JTextField insertTf = new JTextField(10);
JLabel lblResult = new JLabel("제품이 나오는 곳");
// 제품을 보여주는 화면
public JPanel Output() { //displayProducts
JPanel panC = new JPanel(new GridLayout(3,3));
for (ProductVO vo : proList) {
ImageIcon icon = new ImageIcon("imgs/" + vo.getImageName() + ".png");
JLabel lbl = new JLabel(icon);
lblList.add(lbl);
panC.add(lbl);
}
return panC;
}
// 제품을 입력(구매)하는 화면
public JPanel Input() { //inputPurchase
JPanel panS = new JPanel();
JLabel lblMoney = new JLabel("금액");
JButton btnInsert = new JButton("투입");
//차례대로 넣는 거
panS.add(lblMoney); panS.add(insertTf); panS.add(btnInsert);
panS.add(lblResult);
return panS;
}
public void setProductList(ArrayList<ProductVO> proList) {
this.proList = proList;
}
}
2-3) 자판기 기능 추가
package product.view;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.*;
import product.controller.ProductController;
import product.vo.ProductVO;
public class ProductView {
ArrayList<ProductVO> proList; // proList ArrayList선언
ArrayList<JLabel> lblList = new ArrayList<JLabel>();
JTextField insertTf = new JTextField(10);
JLabel lblResult = new JLabel("제품이 나오는 곳");
JFrame frame;
ProductVO vo;
// 제품을 보여주는 화면
public JPanel Output(JFrame frame) { // displayProducts
this.frame = frame;
JPanel panC = new JPanel(new GridLayout(3, 3));
for (ProductVO vo : proList) {
ImageIcon icon = new ImageIcon("imgs/" + vo.getImageName() + ".png");
JLabel lbl = new JLabel(icon);
lbl.addMouseListener(lblL);
lblList.add(lbl);
panC.add(lbl);
}
return panC;
}
// 제품을 입력(구매)하는 화면
public JPanel Input() { // inputPurchase
JPanel panS = new JPanel();
JLabel lblMoney = new JLabel("금액");
JButton btnInsert = new JButton("투입");
btnInsert.addActionListener(btnL);
// 차례대로 넣는 거
panS.add(lblMoney);
panS.add(insertTf);
panS.add(btnInsert);
panS.add(lblResult);
return panS;
}
public void setProductList(ArrayList<ProductVO> proList) {
this.proList = proList;
}
MouseAdapter lblL = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
for (int i = 0; i < lblList.size(); i++) {
if (e.getSource() == lblList.get(i)) {
vo = proList.get(i);
}
}
JOptionPane.showMessageDialog(frame, "제품명 : " + vo.getProName() + "제품 가격 : " + vo.getPrice() + "원");
}
};
ActionListener btnL = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//투입된 버튼이 클릭되었을때
//JTextField에 입력된 금액과 현재 금액을 비교하여 양수이상이면 제품과 거스름돈이 나오게
//금액이 부족하면 부족하다고 출력되게
int money = Integer.parseInt(insertTf.getText());
if(money >= vo.getPrice()) {
lblResult.setText(vo.getProName() + " 제품 나옴, 거스름돈 : " + (money - vo.getPrice()) + "원");
}else {
lblResult.setText("금액이 부족합니다");
}
}
};
}
package product.view;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.*;
import product.controller.ProductController;
import product.vo.ProductVO;
public class ProductView {
ArrayList<ProductVO> proList; // proList ArrayList선언
ArrayList<JLabel> lblList = new ArrayList<JLabel>();
JTextField insertTf = new JTextField(10);
JLabel lblResult = new JLabel("제품이 나오는 곳");
JFrame frame;
ProductVO vo;
// 제품을 보여주는 화면
public JPanel Output(JFrame frame) { // displayProducts
this.frame = frame;
JPanel panC = new JPanel(new GridLayout(3, 3));
for (ProductVO vo : proList) {
ImageIcon icon = new ImageIcon("imgs/" + vo.getImageName() + ".png");
JLabel lbl = new JLabel(icon);
lbl.addMouseListener(lblL);
lblList.add(lbl);
panC.add(lbl);
}
return panC;
}
// 제품을 입력(구매)하는 화면
public JPanel Input() { // inputPurchase
JPanel panS = new JPanel();
JLabel lblMoney = new JLabel("금액");
JButton btnInsert = new JButton("투입");
btnInsert.addActionListener(btnL);
// 차례대로 넣는 거
panS.add(lblMoney);
panS.add(insertTf);
panS.add(btnInsert);
panS.add(lblResult);
return panS;
}
public void setProductList(ArrayList<ProductVO> proList) {
this.proList = proList;
}
MouseAdapter lblL = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
for (int i = 0; i < lblList.size(); i++) {
if (e.getSource() == lblList.get(i)) {
vo = proList.get(i);
}
}
JOptionPane.showMessageDialog(frame, "제품명 : " + vo.getProName() + "제품 가격 : " + vo.getPrice() + "원");
}
};
ActionListener btnL = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//투입된 버튼이 클릭되었을때
//JTextField에 입력된 금액과 현재 금액을 비교하여 양수이상이면 제품과 거스름돈이 나오게
//금액이 부족하면 부족하다고 출력되게
int money = Integer.parseInt(insertTf.getText());
if(money >= vo.getPrice()) {
lblResult.setText(vo.getProName() + " 제품 나옴, 거스름돈 : " + (money - vo.getPrice()) + "원");
}else {
lblResult.setText("금액이 부족합니다");
}
}
};
}
<음료 자판기 개선>
1. 개선할 점
- 선택한 라벨에 배경색 변경
- 제품이 나온후에는 배경이 흰색
- 제품이 나올때 제품 사진이 보이게
- 거스름돈은 대화상자로 표시
- 가격표 나타내기
2. 코드
package product.controller;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.JPanel;
import product.view.ProductView;
import product.vo.ProductDAO;
import product.vo.ProductVO;
public class ProductController extends JFrame {
ArrayList<ProductVO> proList; //필드로 선언해주기
public static final int STOP = 0;
public ProductController() {
//JFrame 배경색 변경
ProductView view = new ProductView();
fullProduct(); //자판기 채우는걸 호출
view.setProductList(proList);
JPanel PanC = view.Output(this);
JPanel panS= view.Input();
add(PanC, "Center"); //자판기 모양 가운데 에 넣기
add(panS, "South"); //금액 투입부분 south에 넣기
setTitle("음료 자판기");
// 기본이 영어로 default 닫기 close 연산 operation
setDefaultCloseOperation(EXIT_ON_CLOSE);
// setLocation(100, 50);
// setSize(600, 600);
setBounds(100, 0, 500, 750);
setVisible(true); //맨마지막에 있기
setResizable(false); //고정되지 않게 만들어줌
}
public void fullProduct() {
// 자판기에 제품 채우기
ProductDAO dao = new ProductDAO();
String names2[] = { "콜라", "코코팜", "포도 웰치스", "초록매실", "밀키스", "파워에이드", "오렌지 쥬스", "비락식혜",
"사이다" };
String names[] = { "coca", "cocopap", "grape", "masil", "milkis", "powerade", "orange juice", "sichec", "sida"};
int[] prices = { 800, 900, 1100, 1100, 1500, 1600, 2000, 1000, 700 };
ProductVO vo = null;
proList = dao.select();
for (int i = 0; i < names.length; i++) {
vo = new ProductVO();
vo.setProName(names2[i]);
vo.setPrice(prices[i]);
vo.setProductNum(i);
vo.setAmount(10);
vo.setImageName(names[i]);
proList.add(vo);
}
}
public static void main(String[] args) {
new ProductController();
}
}
package product.view;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.*;
import product.controller.ProductController;
import product.vo.ProductVO;
public class ProductView {
ArrayList<ProductVO> proList; // proList ArrayList선언
ArrayList<JLabel> lblList = new ArrayList<JLabel>();
JTextField insertTf = new JTextField(10);
JLabel lblResult = new JLabel("");
JFrame frame;
ProductVO vo;
JLabel eLbl;
// 제품을 보여주는 화면
public JPanel Output(JFrame frame) { // displayProducts
this.frame = frame;
JPanel panC = new JPanel(new GridLayout(3, 3));
JPanel pan = null;
JLabel lblPrice = null;
for (ProductVO vo : proList) {
ImageIcon icon = new ImageIcon("imgs/" + vo.getImageName() + ".png");
JLabel lbl = new JLabel(icon);
lbl.setOpaque(true); // 배경 투명한 색
lbl.setBackground(Color.WHITE); // 배경 흰색으로 만들기
lbl.addMouseListener(lblL);
lblList.add(lbl);
lblPrice = new JLabel(vo.getPrice() + "원", JLabel.CENTER);
lblPrice.setFont(new Font("중고딕", Font.BOLD, 15));
lblPrice.setOpaque(true);
lblPrice.setBackground(new Color(232,217,255));
pan = new JPanel(new BorderLayout());
pan.add(lbl, "Center");
pan.add(lblPrice, "South");
panC.add(pan);
}
return panC;
}
// 제품을 입력(구매)하는 화면
public JPanel Input() { // inputPurchase
JPanel panS = new JPanel();
JLabel lblMoney = new JLabel("금액");
JButton btnInsert = new JButton("투입");
btnInsert.addActionListener(btnL);
// 차례대로 넣는 거
panS.add(lblMoney);
panS.add(insertTf);
panS.add(btnInsert);
panS.add(lblResult);
return panS;
}
public void setProductList(ArrayList<ProductVO> proList) {
this.proList = proList;
}
MouseAdapter lblL = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
eLbl = (JLabel) e.getSource();
for (int i = 0; i < lblList.size(); i++) {
if (eLbl == lblList.get(i)) {
lblList.get(i).setBackground(Color.DARK_GRAY);
vo = proList.get(i);
}
}
//JOptionPane.showMessageDialog(frame, "제품명 : " + vo.getProName() + "제품 가격 : " + vo.getPrice() + "원");
}
};
ActionListener btnL = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 투입된 버튼이 클릭되었을때
// JTextField에 입력된 금액과 현재 금액을 비교하여 양수이상이면 제품과 거스름돈이 나오게
// 금액이 부족하면 부족하다고 출력되게
int money = Integer.parseInt(insertTf.getText());
if (money >= vo.getPrice()) {
ImageIcon icon = new ImageIcon("imgs/" + vo.getImageName() + ".png");
lblResult.setIcon(icon);
JOptionPane.showMessageDialog(frame, vo.getProName() + " 제품 나옴, 거스름돈 : " + (money - vo.getPrice()) + "원");
insertTf.setText("");
} else {
JOptionPane.showMessageDialog(frame, "금액이 부족합니다");
}
insertTf.setText("");
eLbl.setBackground(Color.white);
}
};
}
3. 실행 화면
이런식으로 완성!!
'AfterSchool > 자바 방과후' 카테고리의 다른 글
방과후 8일차_경마 게임 만들기 (2) | 2023.01.04 |
---|---|
방과후 7일차_Thread개념, 예외처리, 시간에 따라 사진 바뀌는 프로그램 (0) | 2023.01.03 |
깃허브 쓰는법, Vending Machine 로직소스 만들기(1230) (0) | 2022.12.30 |
성적프로그램과 BMI프로그램 만들기(1229) (0) | 2022.12.29 |
Event Programming EventListener 4가지 방법과 도서 정보 관리 시스템(1228) (0) | 2022.12.28 |