AfterSchool/자바 방과후

성적프로그램과 BMI프로그램 만들기(1229)

노 코딩 노 라이프 2022. 12. 29. 23:23

< 성적프로그램 >

1. 조건

  1. Swing패키지의 컨테인와 컴포넌트를 사용
  2. 한 학생에 대한 학생 정보 및 성적 정보 → 학번, 성명, 학년, 반, 국어, 영어, 수학, 과학, 총점, 평균
  3. 입력 : JTextField를 사용하여 입력 받는다.
  4. 입력받은 정보를 기번으로 2번의 내용을 JTable에 출력
  5. MVC model 사용여부는 선택
  6. 실행화면

 

2. 코드

 M

  • StudentScoreVO, StudentScoreDVO
package score.vo;

public class StudentScoreVO {
	private int stuId;   //학번
	private String name; //이름
	private int grade;   //학년
	private int ban;     //반
	private int kor;     //영어
	private int eng;     //영어
	private int math;	 //수학
	private int sci;	 //과학
	private int total;	 //총점
	private double avg;  //평균
	
	public StudentScoreVO() {
		
	}
	public StudentScoreVO(int stuId, String name, int grade, int ban, int kor, int eng, int math, int sci, int total,
			double avg) {
		super();
		this.stuId = stuId;
		this.name = name;
		this.grade = grade;
		this.ban = ban;
		this.kor = kor;
		this.eng = eng;
		this.math = math;
		this.sci = sci;
		this.total = total;
		this.avg = avg;
	}

	public int getStuId() {
		return stuId;
	}

	public void setStuId(int stuId) {
		this.stuId = stuId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getGrade() {
		return grade;
	}

	public void setGrade(int grade) {
		this.grade = grade;
	}

	public int getBan() {
		return ban;
	}

	public void setBan(int ban) {
		this.ban = ban;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getMath() {
		return math;
	}

	public void setMath(int math) {
		this.math = math;
	}

	public int getSci() {
		return sci;
	}

	public void setSci(int sci) {
		this.sci = sci;
	}

	public int getTotal() {
		return total;
	}

	public void setTotal() {
		this.total = kor + sci + math + eng;
	}

	public double getAvg() {
		return avg;
	}

	public void setAvg() {
		this.avg = total / 4.0;
	}
	
	

	@Override
	public String toString() {
		return "StudentScoreVO [stuId=" + stuId + ", name=" + name + ", grade=" + grade + ", ban=" + ban + ", kor="
				+ kor + ", eng=" + eng + ", math=" + math + ", sci=" + sci + ", total=" + total + ", avg=" + avg + "]";
	}
	
	
}
package score.vo;

import java.util.ArrayList;

public class StudentScoreDAO {
	// ArrayList 만들기
	ArrayList<StudentScoreVO> scoList = new ArrayList();

	// insert 만들기
	public void insert(StudentScoreVO sco) {
		scoList.add(sco);
	}
	// select
	public ArrayList<StudentScoreVO> select(){
		return scoList;
	}
	
	//delete 삭제 메소드
	public void delete(int row){
		scoList.remove(row);
	}
}
  • V
    • StudentScoreView
package score.view;

import java.awt.BorderLayout;

import java.awt.GridLayout;
import java.util.ArrayList;

import javax.swing.JButton;
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 score.vo.StudentScoreVO;

public class StudentScoreView extends JPanel {
	// 5,4
	JTable table;
	DefaultTableModel model;
	ArrayList<StudentScoreVO> scoreVOList;
	String header[] = { "학번", "이름", "학년", "반", "국어", "영어", "수학", "과학", "총점", "평균" };
	// 패널 선언
	JPanel panS;
	JLabel lbls[] = new JLabel[header.length - 2];
	JTextField tf[] = new JTextField[header.length - 2];
	// 버튼 추가
	JButton btnAdd = new JButton("성적 추가");

	// 생성자
	public StudentScoreView() {
		setLayout(new BorderLayout());
		panS = new JPanel();
		panS.setLayout(new GridLayout(5, 4)); // 행 열

		for (int i = 0; i < lbls.length; i++) {
			lbls[i] = new JLabel(header[i]);
			panS.add(lbls[i]);
			tf[i] = new JTextField();
			panS.add(tf[i]);
		}

		// 빈칸추가
		for (int i = 0; i < 3; i++) {
			panS.add(new JLabel(" "));
		}
		panS.add(btnAdd);
	}

	// initView : JLable
	public void initView() {
		model = new DefaultTableModel(header, scoreVOList.size()) {
			@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(50);
		table.getColumnModel().getColumn(2).setPreferredWidth(50);
		table.getColumnModel().getColumn(3).setPreferredWidth(50);
		table.getColumnModel().getColumn(4).setPreferredWidth(50);
		table.getColumnModel().getColumn(5).setPreferredWidth(50);
		table.getColumnModel().getColumn(6).setPreferredWidth(50);
		table.getColumnModel().getColumn(7).setPreferredWidth(50);
		table.getColumnModel().getColumn(8).setPreferredWidth(50);
		table.getColumnModel().getColumn(9).setPreferredWidth(50);
		// 스크롤바 만들기
		JScrollPane scroll = new JScrollPane(table);

		putResult();

		add("Center", scroll);
		add("South", panS);
	}

	public void putResult() {
		// modelml 행 개수 설정
		model.setRowCount(scoreVOList.size());
		StudentScoreVO vo = null;
		for (int i = 0; i < scoreVOList.size(); i++) {
			vo = scoreVOList.get(i);
			model.setValueAt(vo.getStuId(), i, 0);
			model.setValueAt(vo.getName(), i, 1);
			model.setValueAt(vo.getGrade(), i, 2);
			model.setValueAt(vo.getBan(), i, 3);
			model.setValueAt(vo.getKor(), i, 4);
			model.setValueAt(vo.getEng(), i, 5);
			model.setValueAt(vo.getMath(), i, 6);
			model.setValueAt(vo.getSci(), i, 7);
			model.setValueAt(vo.getTotal(), i, 8);
			model.setValueAt(vo.getAvg(), i, 9);
		}
	}

	public void setscoreVOList(ArrayList<StudentScoreVO> scoreVOList) {
		this.scoreVOList = scoreVOList;
	}

	public JButton getBtnAdd() {
		return btnAdd;
	}

	public StudentScoreVO neededInsertData() {
		StudentScoreVO vo = new StudentScoreVO();
		vo.setStuId(Integer.parseInt(tf[0].getText()));
		vo.setName((tf[1].getText()));
		vo.setGrade(Integer.parseInt(tf[2].getText()));
		vo.setBan(Integer.parseInt(tf[3].getText()));
		vo.setKor(Integer.parseInt(tf[4].getText()));
		vo.setEng(Integer.parseInt(tf[5].getText()));
		vo.setMath(Integer.parseInt(tf[6].getText()));
		vo.setSci(Integer.parseInt(tf[7].getText()));
		vo.setTotal();
		vo.setAvg();
		return vo;

	}

	public void initInsertData() {
		for (int i = 0; i < tf.length; i++) {
			tf[i].setText("");
		}
	}
	public JTable getTable() {
		return table;
	}
}
  • C
    • StudentScoreController
package score.controller;

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.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTable;

import score.vo.StudentScoreVO;
import score.view.StudentScoreView;
import score.vo.StudentScoreDAO;
import score.vo.StudentScoreVO;

public class StudentScoreController extends JFrame {

	StudentScoreDAO dao;
	ArrayList<StudentScoreVO> scoreVOLIst;
	StudentScoreView view;
	JTable table;
	
	public StudentScoreController() {
		dao = new StudentScoreDAO();
		view = new StudentScoreView();
		scoreVOLIst = dao.select();
		view.setscoreVOList(scoreVOLIst);
		view.initView();
		JButton btnAdd = view.getBtnAdd();
		btnAdd.addActionListener(btnAddL);
		// table 만들기
		table = view.getTable();
		table.addMouseListener(tableL);
		
		add(view, "Center");
		setTitle("성적 관리 시스템");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocation(200, 100);
		setSize(600, 500);
		setVisible(true);
	}

	public static void main(String[] args) {
		new StudentScoreController();
	}

	ActionListener btnAddL = new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			// neededInsertData() : panS에 있는 JTextField에 입력된 값들과 JCombobox의 값
			// BookVO에 필드값들을 초기화하여 BookVO 객체에 참조값을 변환하는 메소드
			StudentScoreVO vo = view.neededInsertData();
			dao.insert(vo);
			scoreVOLIst = dao.select();
			view.setscoreVOList(scoreVOLIst);// bookVOLIst를 다시 view에 넣어주기
			view.putResult();
			view.initInsertData(); // (사용자의 편리를 위한것) 기존의 입력됐던 값들을 처음으로 초기화시켜줌
		}
	};

	// 마우스로 더블 클릭했을 때
	MouseAdapter tableL = new MouseAdapter() { //필요한 메소드만 오버라이딩해서 사용할 수 있음
		public void mouseClicked(MouseEvent e) {
			int state = 1;
			// 클릭된 횟수
			if (e.getClickCount() == 2) { // 더블클릭
				state = JOptionPane.showConfirmDialog(StudentScoreController.this, "정말 삭제하시겠습니까?", "삭제여부",
						JOptionPane.YES_NO_OPTION); // 그냥 this 쓰면 리스너 참조값이 되어버림 JFrame의 상속을 받은 StudentScoreController를 tkdyd
				if (state == JOptionPane.YES_OPTION) {
					dao.delete(table.getSelectedRow());
					scoreVOLIst = dao.select();
					view.setscoreVOList(scoreVOLIst);
					view.putResult();
					//view.initInsertData();
				}
			}
		}
	};
}

 

3. 실행 화면

 

 

 

 

4. 마우스 만드는법

첫번째 방법

new MouseListener() {

         5개 메소드 오버라이딩

}

단점 : 5개의 메소드를 오버라이딩 해야됨 하나만 필요한데

 

 

두번째 방법

MouseAdapter tableL = new MouseAdapter() {

        public void MouseAdapter tableL = new MouseAdapter() {

         }

};

 

 

 


<체질량지수(BMI)>

1. 조건

  • bmi(kg/m^) = 체중 / (키/100)^
  • String.format(”%.2f”, bmi)
  • 키, 체중, bmi

2. 코드

  • M
    • BMIVO
package bmi.vo;

public class BMIVO {
	private double weight;
	private double height;
	private double bmi;
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public double getBmi() {
		return bmi;
	}
	public void setBmi() {
		this.bmi = weight / Math.pow(height/100, 2);
	}
	
	
}
  • BMIDAO
package bmi.vo;

import java.util.ArrayList;

public class BMIDAO {
	//ArrayList
	ArrayList<BMIVO> bmiList = new ArrayList();
	
	//Insert
	public void insert(BMIVO bmi) {
		bmiList.add(bmi);
	}
	
	//select
	public ArrayList<BMIVO> select() {
		return bmiList;
		
	}
}
  • V
    • BMIView
package bmi.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 javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import bmi.vo.BMIVO;

public class BMIView extends JFrame {
	JTextField tfWeight, tfHeight;
	JLabel lblIcon, lblResult;
	public BMIView() {
		add(new PanelAbove(),"North");
		add(new PanelBelow(),"Center");
		setTitle("BMI(Body Measure Index)");
		setResizable(false); // 화면 크기 고정하는 작업
		setLocationRelativeTo(null);  //윈도우 창을 화면의 가운데에 띄우는 역할
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocation(50, 50);
		setSize(400, 600);
		setVisible(true);
	}
	//inner 클래스
	class PanelAbove extends JPanel{
		public PanelAbove() {
			setBackground(new Color(204, 204, 255));
			setLayout(new BorderLayout());
			JLabel lblTitle = new JLabel("체질량지수(BMI)", JLabel.CENTER); 
			Font font = new Font("맑은 고딕", Font.BOLD, 25);
			lblTitle.setFont(font);
			JLabel lblWeight = new JLabel("체중: ");
			JLabel lblHeight = new JLabel("신장: ");
			JLabel lblkg = new JLabel("㎏");
			JLabel lblcm = new JLabel("㎝");
			JButton btnResult = new JButton("결과확인");
			btnResult.addActionListener(btnL);
			tfWeight = new JTextField(10);
			tfHeight = new JTextField(10);
			add(lblTitle, "North");
			JPanel panCenter = new JPanel(new BorderLayout());
			
			JPanel[] pans = new JPanel[3];
			for (int i = 0; i < pans.length; i++) {
				pans[i] = new JPanel();
			}
			
			panCenter.add(pans[0], "North");
			panCenter.add(pans[1], "Center");
			pans[0].add(lblWeight); pans[0].add(tfWeight); pans[0].add(lblkg);
			pans[1].add(lblHeight); pans[1].add(tfHeight); pans[1].add(lblcm);
			pans[2].add(btnResult);
			
			add(panCenter, "Center");
			add(pans[2], "South");
		}
	}
	
	class PanelBelow extends JPanel{
		public PanelBelow() {
			setBackground(new Color(255, 204, 229));
			setLayout(new BorderLayout());
			lblResult = new JLabel("<html><center>당신의 체중은 _㎏, 키는 _㎝이므로<br>bmi지수는 _㎏/㎡이며, __체중입니다.</center></html>", JLabel.CENTER);
			Font font = new Font("맑은 고딕", Font.BOLD, 20);
			lblResult.setFont(font);
			ImageIcon icon = new ImageIcon("imgs/bmi_original.jpg");
			lblIcon = new JLabel(icon, JLabel.CENTER);
			add(lblResult, "North");
			add(lblIcon, "Center");
		}
	}
	
	ActionListener btnL = new ActionListener() {
		
		@Override
		public void actionPerformed(ActionEvent e) {
//			BMIVO 객체에 입력 받은 체중과 키를 설정하고 bmi를 설정한다.
			BMIVO vo = new BMIVO();
			double weight = Double.parseDouble(tfWeight.getText());
			double height = Double.parseDouble(tfHeight.getText());
			vo.setWeight(weight);
			vo.setHeight(height);
			vo.setBmi();
			String bmiResult ="";
			ImageIcon icon = null;
			if(vo.getBmi() < 18.5) {
				bmiResult = "저";
				icon = new ImageIcon("imgs/under.jpg");
			}else if(vo.getBmi() < 24.9) {
				bmiResult = "정상";
				icon = new ImageIcon("imgs/normal.jpg");
			}else if(vo.getBmi() < 29.9) {
				bmiResult = "과";
				icon = new ImageIcon("imgs/over.jpg");
			}else if(vo.getBmi() < 34.9) {
				bmiResult = "비만";
				icon = new ImageIcon("imgs/obese.jpg");
			}else {
				bmiResult = "고도비만";
				icon = new ImageIcon("imgs/extremely.jpg");
			}
			
			lblResult.setText("<html><center>당신의 체중은 "+vo.getWeight()+"㎏, 키는 "+vo.getHeight()+"㎝이므로"
					+ "<br>bmi지수는 "+String.format("%.1f", vo.getBmi())+"㎏/㎡이며,<br> "
					+bmiResult+"체중입니다.</center></html>");
			lblIcon.setIcon(icon);
		}
	};
	
}
  • C
    • BMIController
package bmi.controller;

import bmi.view.BMIView;

public class BMIController {

	public static void main(String[] args) {
		new BMIView();

	}

}

3. 실행 화면

입력화면
결과화면