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()--------------- }////////////////////////////////////////////////////////////////////////////