도라에몽주머니

[Java/Eclipse] Java 45, 46일차 본문

Study/Java

[Java/Eclipse] Java 45, 46일차

에몽쓰 2022. 11. 18. 16:54

Java

 

setResizable

: 창의 크기를 고정할 때 사용하는 명령어(true: 크기 조절 가능, false: 크기 조절 불가능)

 

TextArea

: 여러 줄의 텍스트를 입력하거나 보여줄 수 있는 편집 가능한 컴포넌트. 많은 양의 텍스트를 담을 때 사용.

 

예제

27-File 성적관리 프로그램을 아래와 같이 윈도우 화면으로 꾸민 후,

학생들 성적을 출력하도록 프로그램을 작성하세요.

 

Class Name : score/ScoreForm.java (Frame 클래스 상속)

score/Prac4.java (main)

score/ScoreVO.java (27-File)

score/Score.java (27-File) → (수정)

score/ScoreImpl.java (27-File) → (수정)

score/ObjectInOut1.java (27-File)

 

// ScoreVO.java
package score;

import java.io.Serializable;

public class ScoreVO implements Serializable {
	private String hak; 		// 학번
	private String name; 		// 이름
	private int kor, eng, mat; 	// 국어, 영어, 수학
	private int tot; 			// 총점
	private double avg; 		// 평균

	public String toString() {
		if (hak == null || name == null)
			return null;

		String str = String.format("%s\t%s\t%d\t%d\t%d\t%d\t%.1f", 
				hak, name, kor, eng, mat, tot, avg);
		return str;
	}
	
	// getter / setter
	public String getHak() {
		return hak;
	}

	public void setHak(String hak) {
		this.hak = hak;
	}

	public String getName() {
		return name;
	}

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

	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 getMat() {
		return mat;
	}

	public void setMat(int mat) {
		this.mat = mat;
	}

	public int getTot() {
		return tot;
	}

	public void setTot(int tot) {
		this.tot = tot;
	}

	public double getAvg() {
		return avg;
	}

	public void setAvg(double avg) {
		this.avg = avg;
	} 
}
// Score.java
package score;

public interface Score {
	public void input(ScoreVO vo);	// 입력
	public String print();			// 출력
	public String printTitle();		// 제목 출력
	public String searchHak(String hak);   // 검색 : 학번
	public String searchName(String name); // 검색 : 이름	
	public String write();			// 파일 저장
	public String read();			// 파일 읽기
}
// ScoreImpl.java
package score;

import java.util.ArrayList;
import java.util.List;

public class ScoreImpl implements Score {
	// 선언
	// 학생 전체 데이터 저장
	List<ScoreVO> list = new ArrayList<ScoreVO>();
	// 파일 입출력
	ObjectInOut1 objectInOut = new ObjectInOut1();

	@Override
	public void input(ScoreVO vo) {
		// 리스트에 저장
		list.add(vo);
	}

	@Override
	public String print() {
		String result = printTitle();
		for (int i = 0; i < list.size(); i++) {
			ScoreVO vo = list.get(i);
			result += vo.toString() + "\n";
		}

		return result;
	}

	@Override
	public String printTitle() {
		return String.format("%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "NUM", "NAME", "KOR", "ENG", "MATH", "TOTAL", "AVERAGE");
	}

	@Override
	public String searchHak(String hak) {
		boolean is_exist = false;
		String result = "";

		for (int i = 0; i < list.size(); i++) {
			ScoreVO vo = list.get(i);
			if (hak.equals(vo.getHak())) {
				result = printTitle();
				result += vo.toString();
				is_exist = true;
				break;
			}
		}
		if (!is_exist) {
			result = hak + " 학번은 없습니다.";
		}

		return result;
	}

	@Override
	public String searchName(String name) {
		boolean is_exist = false;
		String result = "";

		for (int i = 0; i < list.size(); i++) {
			ScoreVO vo = list.get(i);

			if (name.equals(vo.getName())) {
				if (!is_exist) result = printTitle();
				result += vo.toString() + "\n";
				is_exist = true;
			}
		}

		if (!is_exist) result = name + " 학생은 없습니다.";
		
		return result;
	}

	// 파일 저장
	@Override
	public String write() {
		boolean result = objectInOut.write("score.txt", list);
		if (result) {
			return "파일 저장 성공";
		} else {
			return "파일 저장 실패";
		}
	}

	// 파일 읽기
	@Override
	public String read() {
		// 기존 데이터 삭제
		list.clear();

		list = objectInOut.read("score.txt");
		if (list.size() > 0) {
			return "파일 읽기 성공";
		}

		return "";
	}
}
// ObjectInOut1.java
package score;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

public class ObjectInOut1 {
	// 1) 파일 저장
	public boolean write(String fileName, List<ScoreVO> list) {
		boolean result = false;
		FileOutputStream fos = null;
		ObjectOutputStream oos = null;

		try {
			fos = new FileOutputStream(fileName);
			oos = new ObjectOutputStream(fos);

			oos.writeInt(list.size());

			for (int i = 0; i < list.size(); i++) {
				ScoreVO vo = list.get(i);
				oos.writeObject(vo);
			}
			result = true;
		} catch (FileNotFoundException e) {
			System.out.println("[ERROR] 파일 생성 실패");
		} catch (IOException e) {
			System.out.println("[ERROR] 파일 저장 실패");
		} catch (Exception e) {
			System.out.println("[ERROR] 알 수 없는 에러");
		} finally {
			try {
				if (oos != null)
					oos.close();
				if (fos != null)
					fos.close();
			} catch (IOException e) {
				System.out.println("[ERROR] 파일 닫기 에러");
			}
		}

		return result;
	}

	// 2) 파일 읽기
	public List<ScoreVO> read(String fileName) {
		List<ScoreVO> list = new ArrayList<ScoreVO>();
		FileInputStream fis = null;
		ObjectInputStream ois = null;

		try {
			fis = new FileInputStream(fileName);
			ois = new ObjectInputStream(fis);

			int num = ois.readInt();

			for (int i = 0; i < num; i++) {
				ScoreVO vo = (ScoreVO) ois.readObject();
				list.add(vo);
			}
		} catch (FileNotFoundException e) {
			System.out.println("[ERROR] 파일의 경로를 찾을 수 없습니다. >> " + fileName);
		} catch (IOException e) {
			System.out.println("[ERROR] 파일 읽기 실패 >> " + fileName);
		} catch (ClassNotFoundException e) {
			System.out.println("[ERROR] 클래스가 없습니다. >> " + fileName);
		} catch (Exception e) {
			System.out.println("[ERROR] 알 수 없는 에러");
		} finally {
			try {
				if (ois != null)
					ois.close();
				if (fis != null)
					fis.close();
			} catch (IOException e) {
				System.out.println("[ERROR] 파일 닫기 실패");
			}
		}
		return list;
	}
}
// ScoreForm.java
package score;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class ScoreForm extends Frame implements ActionListener {
	// 선언
	/* 데이터 처리 클래스 */
	Score score = new ScoreImpl();

	/* 컴포넌트 */
	Button btn_input = new Button("입력");
	Button btn_output = new Button("출력");
	Button btn_num = new Button("학번검색");
	Button btn_name = new Button("이름검색");
	Button btn_save = new Button("파일저장");
	Button btn_read = new Button("파일읽기");

	Label labelNum = new Label("학번");
	Label labelName = new Label("이름");
	Label labelKor = new Label("국어");
	Label labelEng = new Label("영어");
	Label labelMat = new Label("수학");

	TextField textFieldNum = new TextField(12);
	TextField textFieldName = new TextField(12);
	TextField textFieldKor = new TextField(12);
	TextField textFieldEng = new TextField(12);
	TextField textFieldMat = new TextField(12);

	TextArea textArea = new TextArea(10, 48);

	Panel panelInput = new Panel(); // 입력
	Panel panelButton = new Panel(); // 버튼
	Panel panelNum = new Panel(); // 학번
	Panel panelName = new Panel(); // 이름
	Panel panelKor = new Panel(); // 국어
	Panel panelEng = new Panel(); // 영어
	Panel panelMat = new Panel(); // 수학

	public ScoreForm() {
		// Frame 기본 설정
		this.setTitle("성적관리");
		this.setSize(600, 300);
		this.setLocation(500, 400);
		this.setResizable(false); // 화면 크기 고정

		init();
		start();

		this.setVisible(true);
		
		// 파일 읽기
		textArea.setText(score.read());
	}

	// 화면 구성
	private void init() {
		// Frame 구성
		this.setLayout(new BorderLayout());
		this.add("West", panelInput);
		this.add("East", textArea);
		this.add("South", panelButton);
		
		// textArea 입력 금지
		textArea.setEditable(false);
		textArea.setBackground(Color.WHITE);

		// panelButton 구성
		panelButton.setLayout(new GridLayout(1, 6));
		panelButton.add(btn_input);
		panelButton.add(btn_output);
		panelButton.add(btn_num);
		panelButton.add(btn_name);
		panelButton.add(btn_save);
		panelButton.add(btn_read);

		// button 설정
		btn_input.setBackground(Color.YELLOW);
		btn_output.setBackground(Color.YELLOW);
		btn_num.setBackground(Color.YELLOW);
		btn_name.setBackground(Color.YELLOW);
		btn_save.setBackground(Color.YELLOW);
		btn_read.setBackground(Color.YELLOW);

		// panelInput 구성
		panelInput.setLayout(new GridLayout(5, 1));
		panelInput.add(panelNum);
		panelInput.add(panelName);
		panelInput.add(panelKor);
		panelInput.add(panelEng);
		panelInput.add(panelMat);		
		
		// panelNum 구성
		panelNum.setLayout(new FlowLayout());
		panelNum.add(labelNum);
		panelNum.add(textFieldNum);
		
		// panelName 구성
		panelName.setLayout(new FlowLayout());
		panelName.add(labelName);
		panelName.add(textFieldName);
		
		// panelKor 구성
		panelKor.setLayout(new FlowLayout());
		panelKor.add(labelKor);
		panelKor.add(textFieldKor);
		
		// panelEng 구성
		panelEng.setLayout(new FlowLayout());
		panelEng.add(labelEng);
		panelEng.add(textFieldEng);
		
		// panelMat 구성
		panelMat.setLayout(new FlowLayout());
		panelMat.add(labelMat);
		panelMat.add(textFieldMat);
	}

	// 이벤트 설정
	private void start() {
		// x버튼 이벤트 처리
		this.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				super.windowClosing(e);
				System.exit(0);
			}
		});
		
		// 버튼 이벤트 설정
		btn_input.addActionListener(this);
		btn_output.addActionListener(this);
		btn_num.addActionListener(this);
		btn_name.addActionListener(this);
		btn_save.addActionListener(this);
		btn_read.addActionListener(this);
	}

	// 이벤트 처리
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==btn_input) {			// 입력
			String str_num = textFieldNum.getText().trim();
			String str_name = textFieldName.getText().trim();
			String str_kor = textFieldKor.getText().trim();
			String str_eng = textFieldEng.getText().trim();
			String str_mat = textFieldMat.getText().trim();
			
			// 입력 검사 : 학번, 이름
			if(str_num.equals("") || str_name.equals("")) {
				textArea.setText("학번과 이름을 입력하세요");
				return;	// 함수 강제 종료
			}
			
			// 입력 검사 : 국어, 영어, 수학
			if(str_kor.equals("") || str_eng.equals("") || str_mat.equals("")) {
				textArea.setText("국어, 영어, 수학 점수를 입력하세요");
				return;	// 함수 강제 종료
			}
			
			int kor = Integer.parseInt(str_kor);
			int eng = Integer.parseInt(str_eng);
			int mat = Integer.parseInt(str_mat);
			
			int tot = kor + eng + mat;
			double avg = (double)tot / 3;
			
			ScoreVO vo = new ScoreVO();
			vo.setHak(str_num);
			vo.setName(str_name);
			vo.setKor(kor);
			vo.setEng(eng);
			vo.setMat(mat);
			vo.setTot(tot);
			vo.setAvg(avg);
			
			score.input(vo);	
			textArea.setText("입력되었습니다.");
			
			// 화면 초기화
			textFieldNum.setText("");
			textFieldName.setText("");
			textFieldKor.setText("");
			textFieldEng.setText("");
			textFieldMat.setText("");
		} else if(e.getSource()==btn_output) {	// 출력	
			textArea.setText(score.print());
		} else if(e.getSource()==btn_num) {		// 학번 검색
			String hak = textFieldNum.getText().trim();
			// 입력 검사
			if(hak.equals("")) {
				textArea.setText("학번을 입력해주세요");
				return;  // 함수 강제 종료
			}
			textArea.setText(score.searchHak(hak));
			// 화면 초기화
			textFieldNum.setText("");
		} else if(e.getSource()==btn_name) {	// 이름 검색
			String name = textFieldName.getText().trim();
			// 입력 검사
			if(name.equals("")) {
				textArea.setText("이름을 입력해 주세요");
				return;  // 함수 강제 종료
			}
			
			textArea.setText(score.searchName(name));
			// 화면 초기화
			textFieldName.setText("");
		} else if(e.getSource()==btn_save) {	// 파일 저장
			textArea.setText(score.write());
		} else if(e.getSource()==btn_read) {	// 파일 읽기
			textArea.setText(score.read());
		}  
	}
}

'Study > Java' 카테고리의 다른 글

[Java/Eclipse] Java 48일차  (0) 2022.11.22
[Java/Eclipse] Java 47일차  (0) 2022.11.21
[Java/Eclipse] Java 44일차  (0) 2022.11.16
[Java/Eclipse] Java 43일차  (0) 2022.11.15
[Java/Eclipse] Java 42일차  (0) 2022.11.15