본문 바로가기
AfterSchool/자바 방과후

Vending machine GUI로 만들기(1231)

by 노 코딩 노 라이프 2023. 1. 3.

<Vending Machine> GUI로 만들기

1. 조건

  1. 제품이미지 다운로드 : project 폴더 - images 폴더에 저장
  2. View 및 Controller 수정
  3. 음료 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. 개선할 점

  1. 선택한 라벨에 배경색 변경
  2. 제품이 나온후에는 배경이 흰색
  3. 제품이 나올때 제품 사진이 보이게
  4. 거스름돈은 대화상자로 표시
  5. 가격표 나타내기

 

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. 실행 화면

음료 선택
금액을 입력하면 제품과 거스름돈이 나옴

이런식으로 완성!!