Java/Awt_Swing

AWT 이용 학사관리 프로그램

krvision 2011. 12. 5. 09:08

///////////////////////////////////////////Person.java//////////////////////////////////
package my.school;
import static java.lang.System.out;
//5.0버전 이상에서 사용가
import java.util.Scanner;
//5.0버전 이상에서 사용가

public abstract class Person {
	
	
	private String name;
	private String addr;
	
	public Person() {
		super();
	}//기본생성자----
	
	public Person(String name, String addr) {
		super();
		this.name = name;
		this.addr = addr;
	}//인자생성자--------

	//**setter,getter-----*/
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	//**추상메소드  */
	public abstract void setId(String id);
	public abstract String getId();
	
	//**사람 정보를 입력받는 모듈*/
	public void inputInfo()
	throws NotSupportedNameException{
		out.println("이름을 입력하세요=>");
		Scanner sc=new Scanner(System.in);
		String nm=sc.nextLine();
		if(nm.startsWith("콩")){
			throw new NotSupportedNameException("콩씨는 절대로 등록할 수 없어요");
		}else if(nm.startsWith("퐁")){
			throw new NotSupportedNameException("퐁씨는 이용할 수 없어요.");
		}
		
		setName(nm);//멤버 변수에 입력값을 저장
		
		out.println("주소를 입력하세요=>");
		String ad=sc.nextLine();
		setAddr(ad);//멤버 변수에 입력값을 저장
	}//-------------

	//**사람의 정보를 문자열로 돌려주는 메소드
	 
	public String getInfo(){
		String info="이름: "+name+"\n주소: "+addr;
		return info;
	}
	/**사람 정보를 콘솔에 출력해주는 메소드*/
	public void printAll(){
		out.println(this.getInfo());	
	}
	public String toString(){
		return name;
	}
}/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////Student.java///////////////////////////////////////////////////////////////////////
package my.school;
import java.util.*;
import static java.lang.System.out;

public class Student extends Person{
	private String id;//학번
	private String className;//학급
	
	//setter, getter
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getClassName() {
		return className;
	}
	public void setClassName(String className) {this.className = className;
	}
	//overriding
	public String getInfo() {
		String info=super.getInfo()+"\n학번: "
					+id+"\n학급: "+className;
		return info;
	}
	/**학생 정보를 입력받음*/
	public void inputInfo() {
		try {
			super.inputInfo();
		} catch (NotSupportedNameException e) {	out.println(e.getMessage());
			return;
		}
		//이름, 주소, 학번, 학급
		Scanner sc=new Scanner(System.in);
		out.println("학번을 입력하세요=>");
		String i=sc.nextLine();
		setId(i);
		out.println("학급을 입력하세요=>");
		String c=sc.nextLine();
		setClassName(c);
	}
	public void printAll() {
		out.println(this.getInfo());
	}
}///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////Teacher.java////////////////////////////////////////////////////
package my.school;
import java.util.*;
import static java.lang.System.out;

public class Teacher extends Person{

	private String id;//교번
	private String subject;//담당 과목
	
	//setter, getter
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getInfo() {
		String info=super.getInfo()+"\n교번: "+id+"\n담당과목: "+subject;
		return info;
	}
	public void inputInfo() {
		try {
			super.inputInfo();
		} catch (NotSupportedNameException e) {
			out.println(e.getMessage());
			return;
		}
		
		//이름, 주소
		Scanner sc=new Scanner(System.in);
		out.println("교번을 입력하세요=>");
		String i=sc.nextLine();
		setId(i);
		out.println("과목을 입력하세요=>");
		String s=sc.nextLine();
		setSubject(s);		
	}
	public void printAll() {
		out.println(this.getInfo());
	}
}////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////Staff.java////////////////////////////////////////////////
package my.school;
import java.util.*;
import static java.lang.System.out;

public class Staff extends Person{

	private String id;//사번
	private String dept;//부서
	//setter, getter
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getDept() {
		return dept;
	}
	public void setDept(String dept) {
		this.dept = dept;
	}
	public String getInfo() {
		String info=super.getInfo()+"\n사번: "+id+"\n부서: "+dept;
		return info;
	}
	public void inputInfo() {
		try {
			super.inputInfo();
		} catch (NotSupportedNameException e) {	out.println(e.getMessage());
			return;
		}
		
		//이름, 주소
		Scanner sc=new Scanner(System.in);
		out.println("사번을 입력하세요=>");
		String i=sc.nextLine();
		setId(i);
		out.println("부서를 입력하세요=>");
		String d=sc.nextLine();
		setDept(d);
	}
	public void printAll() {
		out.println(this.getInfo());
	}
}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////NotSupportedNameException.java////////////////////////////////////////
package my.school;
/**사용자 정의 예외 클래스
 * -ex] 콩씨 성은 등록 불가*/
public class NotSupportedNameException extends Exception  {
	
	public NotSupportedNameException(){
		super("지원되지 않는 이름입니다.");
		//예외 메시지를 super에 등록...
	}//----------
	public NotSupportedNameException(String msg){
		super(msg);
	}//-----------

}////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////SchoolApp.java(업무처리 로직을 가진 클래스-콘솔 애플리케이션)--///////////////////////////////////////////////
package my.school;
import static java.lang.System.out;
import java.util.*;
//** Console Applicaton * *//
public class SchoolApp {

	private Person[] p=new Person[30];//30명 정원
	private int count;//배열의 인덱스로 사용될 변수
	
	public Person[] getP(){
		return p;
	}
	public int getCount(){
		return count;
	}
	///**메인 메뉴를 보여주는 메소드
	public void mainMenu(){
		out.println("---------------Main Menu--------------");
		out.println("|1. 등록  2. 검색 3. 삭제 4.출력 5. 종료|");
		out.println("--------------------------------------");
		out.println("번호를 입력하세요=>");
		out.println("--------------------------------------");
	}//----------
	///**하위 메뉴를 보여주는 메소드

	public void subMenu(){
		out.println("---------------Sub Menu--------------");
		out.println("| 1.학생  2. 강사 3. 직원 4. 상위메뉴  |");
		out.println("--------------------------------------");
		out.println("번호를 입력하세요=>");
		out.println("--------------------------------------");
	}
	
	public void register(){
		//서브 메뉴 출력...케이스 별로 로직 수행
		Scanner sc=new Scanner(System.in);
		outer://레이블명
		while(true){
			subMenu();
			int no=0;
			try{
				no=sc.nextInt();
			}catch(InputMismatchException e){ out.println("숫자로 입력해야 해요!");
				return;
			}
			switch(no){
			case 1://학생
				Student st=new Student();
				st.inputInfo();//학생정보를 입력받음.
				addPerson(st);//등록된 객체를 배열에 저장한다.
				break;
			case 2://교사
				Teacher tc=new Teacher();
				tc.inputInfo();
				addPerson(tc);
				break;
			case 3://직원
				Staff sf=new Staff();
				sf.inputInfo();
				addPerson(sf);
				break;
			case 4://상위 메뉴
				break outer;//레이블 지정된 반복문을 이탈
				//return;
				//register()메소드를 호출한 쪽으로 제어권을 넘김
			default: out.println("지원되지 않는 메뉴번호입니다.");
			}
		}//while----		
	}//register()------------------
	//**등록한 사람들을 배열에 저장하는 메소드*/
	public void addPerson(Person person){
		if(count");
				String name=sc.next();
				out.println("--"+name+"님을 검색합니다.--");
				sa.findPerson(name);
				break;
			case 3://삭제
				out.println("삭제할 사람 이름=>");
				name=sc.next();
				sa.removePerson(name);
				break;
			case 4://출력
				sa.printAll();
				break;
			case 5://종료
				out.println("Bye Bye~~");
				System.exit(0);
				break;
			default:
				out.println("지원되지 않는 메뉴번호입니다.");
					
			}//switch----		
		}//while-----
	}
}//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////SchoolGui.java(GUI 구성)/////////////////////////////////////////////////////////////////////
package my.school;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class SchoolGui extends Frame{

	SchoolApp sa=new SchoolApp();
	//업무처리 로직을 가진 클래스-콘솔 애플리케이션
	Person p;
	TextArea ta;
	Button reg, del, find, print, save;
		 //등록, 삭제, 검색, 출력, 저장
	Button btStudent, btTeacher, btStaff, btFindOk,btFindClose;
			//학생, 		교사, 	직원,  		검색, 	검색종료
	Button btOk, btCancel, btClose;
	
	Dialog dial1, dial2, dial3;
			//대화상자 3개 만들기...
	Label lbName, lbAddr, lbId, lbPub;
	TextField tfName, tfAddr, tfId, tfPub, tfFindName;
	
	
	
	public SchoolGui(){
		super(":::학사관리 프로그램 v1.1:::");
		makeGui();
		
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		
		setSize(500,500);
		setVisible(true);
	}//생성자-----------
	/**GUI를 구성하는 메소드*/
	public void makeGui(){
		ta=new TextArea();
		add(ta,"Center");
		
		Panel pn=new Panel(new GridLayout(0,1, 10,10)){
			//패널 바깥 여백을 설정하는 메소드 오버라이딩
			public Insets getInsets(){
				return new Insets(10,10,10,10);
			}
		};
							//열은 1열로 고정시키고
							//행은 컴포넌트 부착하는 것에 따라
							//유동적으로..
		pn.setBackground(Color.orange);
		add(pn,"East");
		
		pn.add(reg=new Button("등  록"));
		pn.add(find=new Button("검  색"));
		pn.add(del=new Button("삭  제"));
		pn.add(print=new Button("출  력"));
		pn.add(save=new Button("저  장"));
		
		//Dialog 1만들기
		dial1=new Dialog(this,true);
		dial2=new Dialog(this, true);
		dial3=new Dialog(this, "**검색**", true);
		
		//dial1에 컴포넌트 부착---
		btStudent=new Button("학생");
		btTeacher=new Button("교사");
		btStaff=new Button("직원");
		btClose=new Button("닫기");
		
		dial1.setTitle("**등록**");
		dial1.setLayout(new GridLayout(1,0));
		dial1.add(btStudent);
		dial1.add(btTeacher);
		dial1.add(btStaff);
		dial1.add(btClose);
		
		//dial2에 컴포넌트 부착---
		Panel dp1=new Panel();
		Panel dp2=new Panel();
		Panel dp3=new Panel();
		dp1.setLayout(new GridLayout(4,1));
		dp2.setLayout(new GridLayout(4,1));
		
		dial2.add(dp1,"West");//라벨을 붙일 패널
		dial2.add(dp2,"Center");//텍스트필드 붙일 패널
		dial2.add(dp3,"South");//버튼 붙일 패널
		
		dp1.add(lbName=new Label("이름"));
		dp1.add(lbAddr=new Label("주소"));
		dp1.add(lbId=new Label("ID"));
		dp1.add(lbPub=new Label("기타"));
		
		dp2.add(tfName=new TextField());
		dp2.add(tfAddr=new TextField());
		dp2.add(tfId=new TextField());
		dp2.add(tfPub=new TextField());
		
		dp3.add(btOk=new Button("처리"));
		dp3.add(btCancel=new Button("취소"));
		
		//dial3에 검색 또는 삭제 관련 컴포넌트 부착
		Label lb=new Label("이름을 입력하세요");
		dial3.add(lb,"North");
		Panel dp4=new Panel();
		dial3.add(dp4,"Center");
		tfFindName=new TextField(20);
		dp4.add(tfFindName);
		btFindOk=new Button("확인");
		btFindClose=new Button("닫기");
		dp4.add(btFindOk);
		dp4.add(btFindClose);
		
		//리스너 부착------
		MyHandler my=new MyHandler();//이벤트 처리 클래스
		reg.addActionListener(my);
		find.addActionListener(my);
		del.addActionListener(my);
		print.addActionListener(my);
		save.addActionListener(my);
		
		btStudent.addActionListener(my);
		btTeacher.addActionListener(my);
		btStaff.addActionListener(my);
		btOk.addActionListener(my);
		btCancel.addActionListener(my);
		btClose.addActionListener(my);
		
		btFindOk.addActionListener(my);
		btFindClose.addActionListener(my);
		
		//ta를 편집 불가능하게끔...
		ta.setEditable(false);
		
	}//makeGui()--------
	
	/**이벤트를 처리하는 클래스-Inner Member Class*/
	class MyHandler implements ActionListener{

		public void actionPerformed(ActionEvent e) {
			Object o=e.getSource();
			if(o==reg){//등록
				dial1.pack();
				//각 컴포넌트의 preferred size 만큼 압축하여
				//크기를 정한다.
				dial1.setLocation(500,0);//x,y좌표(500,0)
				dial1.setVisible(true);
				
			}else if(o==find){//검색
				dial3.setTitle("**검색**");
				dial3.pack();
				dial3.setVisible(true);
				
			}else if(o==del){//삭제
				dial3.setTitle("**삭제**");
				dial3.pack();
				dial3.setVisible(true);
				
			}else if(o==print){//출력
				String str=sa.printAll();
				ta.append(str+"\n");
				
			}else if(o==save){//저장
				//1>, 2>
				FileDialog fd
				=new FileDialog(SchoolGui.this,
						"파일저장",FileDialog.SAVE);
				fd.setVisible(true);
				//파일 경로 얻기
				String dir=fd.getDirectory();
				String file=fd.getFile();
				String filename=dir+file;
				setTitle(filename);
				
				try {
					FileWriter fw=new FileWriter(filename);
					String content=ta.getText();
					//ta로부터 가져온 내용을 fw를 통해 쓴다.
					fw.write(content);
					fw.flush();
					fw.close();
					setTitle("저장 완료");
					ta.append("저장 완료!!!->"+filename+"\n");
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				
				/*텍스트에리어에 출력된 내용을 파일로 저장하자.
				 * 1> FileDialog를 저장 모드로 띄운다.
				 * 2> 파일명과 디렉토리명을 얻어와서
				 * 3> java.io.FileWriter클래스 생성자에 파일 절대경로를 넣어주고
				 * 4> ta의 내용을 FileWriter의  write()메소드를 이용해서 쓰기 작업을 한다.
				 *    ...이때 주의...FileWriter의 write()메소드 호출 후 
				 *       반드시 flush()메소드를 호출해주자.   
				 * */
				
			}else if(o==btStudent){//학생
				dial2.setTitle("**학생 등록**");
				lbId.setText("학번");
				lbPub.setText("학급");
				dial2.pack();
				dial2.setLocation(500,30);
				dial2.setVisible(true);
				
			}else if(o==btTeacher){//교사
				dial2.setTitle("**교사 등록**");
				lbId.setText("교번");
				lbPub.setText("과목");
				dial2.pack();
				dial2.setLocation(500, 30);
				dial2.setVisible(true);
				
			}else if(o==btStaff){//직원
				dial2.setTitle("**직원 등록**");
				lbId.setText("사번");
				lbPub.setText("부서");
				dial2.pack();
				dial2.setLocation(500, 30);
				dial2.setVisible(true);
				
			}else if(o==btOk){
				//사용자 정보 등록
				String name=tfName.getText();
				String addr=tfAddr.getText();
				String id=tfId.getText();
				
				String pub=tfPub.getText();
				//어떤 객체이냐에 따라 호출할 메소드가 달라진다.
				
				String title=dial2.getTitle();
				System.out.println(title);
				String word=title.substring(2, 4);
				//문자열 인덱스 2부터 4의 직전까지 잘라내어
				//돌려준다.
				System.out.println(word);
				if(word.equals("학생")){
					p=new Student();
					((Student)p).setClassName(pub);
				}else if(word.equals("교사")){
					p=new Teacher();
					((Teacher)p).setSubject(pub);
				}else if(word.equals("직원")){
					p=new Staff();
					((Staff)p).setDept(pub);
				}
				p.setName(name);
				p.setAddr(addr);
				p.setId(id);
				///////비즈니스 메소드///////////////
				sa.addPerson(p);
				////////////////////////////////////
				tfName.setText("");
				tfId.setText("");
				tfAddr.setText("");
				tfPub.setText("");
				
				//텍스트필드에 포커스가 가게끔..
				tfName.requestFocus();
				
			}else if(o==btCancel){//취소
				dial2.dispose();
				tfName.setText("");
				tfId.setText("");
				tfAddr.setText("");
				tfPub.setText("");
						
			}else if(o==btClose){
				//dial1 닫기
				dial1.dispose();
				
			}
			if(o==btFindOk){//검색(삭제)확인
				String title=dial3.getTitle();
				String word=title.substring(2, 4);
				//제목으로 검색 대화창인지 삭제 대화창인지
				//구별하기 위해 ..
				
				if(word.equals("검색")){
					String name=tfFindName.getText();
					////////////////////////////////
					String msg=sa.findPerson(name);
					////////////////////////////////
					ta.append(msg+"\n");
				}else{
					String name=tfFindName.getText();
					/////////////////////////////////
					String msg=sa.removePerson(name);
					////////////////////////////////
					ta.append(msg+"\n");
				}
				tfFindName.setText("");
				
			}else if(o==btFindClose){//검색(삭제)창 닫기
				dial3.dispose();
			}
			
		}
		
	}//////////////////
	public static void main(String[] args) {
		new SchoolGui();
	}//main()---------------

}////////////////////////////////////////////////////////////////////////////