Archive

Java Day 21 CMS 구현 - GUI

|

Java Day 21 CMS 구현 - GUI


  • 들어가며

지난번 CMS는 GUI 없이 텍스트형태로만 작동하는 프로그램이었다면 이번엔 java awt로 GUI를 구현하여 조금 더 소프트웨어적인 형태를 띈 CMS를 구현했다. 정식 명칭은 FMS (Friend Manager System)이지만 간단한 프로그램이므로 쓰임에따라 얼마든지 CMS가 될 수도 있다.ㅋㅋ;;


  • 완성본

우선 완성본 레이아웃을 먼저 보자면

완성본


개인정보 입력란이 있고 [등록] 버튼을 누르면 전체 목록에 리스트가 올라간다. [분석] 과 기본적인 시스템상 메시지는 개인정보 분석의 text area에 출력된다.

[File]과 [Help] 두 메뉴가 있고 각각 하위 메뉴를 가진다.

File

Help


[Help]의 [Version] 클릭시 다이얼로그가 팝업되어 화면이 나타난다.

Version


  • 소스코드
package lim.java.homework;

import java.awt.*;
import java.awt.List;
import java.awt.event.*;
import java.io.*;
import java.util.*;

public class FirendManager extends Frame implements ActionListener, KeyListener, ItemListener {
	private Dialog d = new Dialog(this, "Friend Manager Version", false);
	private File myFile = null;
	private FileDialog fileDialog;
	private MenuBar mb = new MenuBar();
	private Menu menu_file = new Menu("File");
	private Menu menu_help = new Menu("Help");
	private MenuItem file_new = new MenuItem("New");
	private MenuItem file_save = new MenuItem("Save");
	private MenuItem file_load = new MenuItem("Load");
	private MenuItem file_saveAs = new MenuItem("Save as New name");
	private MenuItem file_exit = new MenuItem("Exit");
	private MenuItem help_ver = new MenuItem("Version");
	private Label empty1 = new Label("");
	private Label empty2 = new Label("");
	private Label empty3 = new Label("");
	private Label empty4 = new Label("");
	private Label title1 = new Label("전체 목록", Label.CENTER);
	private Label title2 = new Label("개 인 정 보 입 력", Label.CENTER);
	private Label title3 = new Label("개 인 정 보 분 석", Label.CENTER);
	private Label lb_name = new Label("이    름 : ", Label.RIGHT);
	private Label lb_id = new Label("주    민 : ", Label.RIGHT);
	private Label lb_tel = new Label("전    화 : ", Label.RIGHT);
	private Label lb_sex = new Label("성    별 : ", Label.RIGHT);
	private Label lb_hobby = new Label("취    미 : ", Label.RIGHT);
	private Label id_sep = new Label("-", Label.CENTER);
	private Label tel_sep1 = new Label("-", Label.CENTER);
	private Label tel_sep2 = new Label("-", Label.CENTER);
	private Label dial_text = new Label("Version 1.0", Label.CENTER);
	private TextField tf_name = new TextField(20);
	private TextField tf_frontId = new TextField(6);
	private TextField tf_backId = new TextField(7);
	private TextField tf_frontTel = new TextField(4);
	private TextField tf_backTel = new TextField(4);
	private List list = new List(45);
	private TextArea ta_analysis = new TextArea(30, 40);
	private CheckboxGroup cb_group = new CheckboxGroup();
	private Checkbox cb_male = new Checkbox("남성", cb_group, true);
	private Checkbox cb_female = new Checkbox("여성", cb_group, false);
	private Checkbox[] hobby_arr = new Checkbox[5];
	private String[] hobby_str = { "독서", "영화", "음악", "게임", "쇼핑" };
	private Choice choice_tel = new Choice();
	private Button[] btn_arr = new Button[5];
	private Button dial_ok = new Button("확인");
	private String[] btn_str = { "등록", "분석", "수정", "삭제", "지우기" };
	private boolean mod = false;
	private int btn_selected = 0;
	private ArrayList<Friends> friend = new ArrayList<>();
	private String name;
	private String age;
	private String sex;
	private String address;
	private String birth;
	private String id;
	private String tel;
	private Boolean[] hobby = new Boolean[5];
	public int year = 1900;

	public FirendManager() {// 생성자
		super("Friend Manager");
		setForm();
		setEvent();
		addWindowListener(new WindowAdapter() {// 종료 이벤트
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		setSize(500, 600);
		setResizable(false);
		setLocation(500, 180);
		setVisible(true);
	}

	public void setForm() {
		// 레이아웃
		setBackground(Color.LIGHT_GRAY);
		setLayout(new BorderLayout());
		add("West", empty1);
		add("East", empty2);
		add("South", empty3);
		add("North", empty4);
		Panel wrapper_upDown = new Panel(new GridLayout(2, 1));
		add("Center", wrapper_upDown);
		Panel wrapper_leftRight = new Panel(new BorderLayout());
		Panel content_analysis = new Panel(new BorderLayout());
		wrapper_upDown.add(wrapper_leftRight);
		wrapper_upDown.add(content_analysis);
		Panel content_input = new Panel(new BorderLayout(5, 10));
		Panel content_list = new Panel(new BorderLayout());
		wrapper_leftRight.add("Center", content_input);
		wrapper_leftRight.add("East", content_list);

		// 메뉴바
		setMenuBar(mb);
		mb.add(menu_file);
		mb.add(menu_help);
		menu_file.add(file_new);
		menu_file.addSeparator();
		menu_file.add(file_save);
		menu_file.add(file_load);
		menu_file.add(file_saveAs);
		menu_file.addSeparator();
		menu_file.add(file_exit);
		menu_help.add(help_ver);

		// 개인정보입력
		content_input.add("North", title2);

		// 개인정보 항목
		Panel ci_items = new Panel(new GridLayout(5, 1));
		ci_items.add(lb_name);
		ci_items.add(lb_id);
		ci_items.add(lb_tel);
		ci_items.add(lb_sex);
		ci_items.add(lb_hobby);
		content_input.add("West", ci_items);

		// 개인정보 이름 입력
		Panel ci_inputs = new Panel(new GridLayout(5, 1));
		Panel ci_input_name = new Panel(new FlowLayout(FlowLayout.LEFT));
		ci_input_name.add(tf_name);
		ci_inputs.add(ci_input_name);

		// 개인정보 주민 입력
		Panel ci_input_id = new Panel(new FlowLayout(FlowLayout.LEFT));
		ci_input_id.add(tf_frontId);
		ci_input_id.add(id_sep);
		ci_input_id.add(tf_backId);
		ci_inputs.add(ci_input_id);

		// 개인정보 전번 입력
		Panel ci_input_tel = new Panel(new FlowLayout(FlowLayout.LEFT));
		String[] tel = { "010", "011", "016", "017", "019" };
		for (int i = 0; i < tel.length; i++) {
			choice_tel.add(tel[i]);
		}
		ci_input_tel.add(choice_tel);
		ci_input_tel.add(tel_sep1);
		ci_input_tel.add(tf_frontTel);
		ci_input_tel.add(tel_sep2);
		ci_input_tel.add(tf_backTel);
		ci_inputs.add(ci_input_tel);

		// 개인정보 성별 입력
		Panel ci_input_sex = new Panel(new FlowLayout(FlowLayout.LEFT));
		ci_input_sex.add(cb_male);
		ci_input_sex.add(cb_female);
		ci_inputs.add(ci_input_sex);

		// 개인정보 취미 입력
		Panel ci_input_hobby = new Panel(new FlowLayout(FlowLayout.LEFT));
		for (int i = 0; i < hobby_arr.length; i++) {
			hobby_arr[i] = new Checkbox(hobby_str[i]);
			ci_input_hobby.add(hobby_arr[i]);
		}
		ci_inputs.add(ci_input_hobby);

		// 버튼
		Panel ci_input_btn = new Panel(new FlowLayout(FlowLayout.CENTER));
		for (int i = 0; i < btn_arr.length; i++) {
			btn_arr[i] = new Button(btn_str[i]);
			ci_input_btn.add(btn_arr[i]);
		}
		content_input.add("South", ci_input_btn);
		content_input.add("Center", ci_inputs);

		// 전체목록
		content_list.add("North", title1);
		content_list.add("Center", list);

		// 개인정보 분석
		content_analysis.add("North", title3);
		content_analysis.add("Center", ta_analysis);

		// 초기 버튼 비활성화
		setMod();
	}

	public void setDialog() {// 다이얼로그 레이아웃
		d.setLayout(new BorderLayout());
		d.setBackground(Color.LIGHT_GRAY);
		d.add("Center", dial_text);
		d.add("South", dial_ok);
		d.setSize(150, 150);
		d.setVisible(true);
		dial_ok.addActionListener(new ActionListener() {// 확인 클릭시 종료
			@Override
			public void actionPerformed(ActionEvent e) {
				d.dispose();
			}
		});
	}


setForm() 메소드를 정의하여 레이아웃을 구현하고 다이얼로그 역시 setDialog() 메소드로 구분지었다.

간단한 기능인 종료 버튼은 익명 클래스를 이용하여 구현했다.

전역변수에 대해 설명을 하자면 각각 신상정보는 String 변수에 담기게 될 것이다. 체크한 선택박스를 저장하기 위해 boolean 배열을 사용했다. 이 정보들을 가지게 될 각각의 객체를 담을 ArrayList를 준비했다.


소스코드 보기


마치며


swing과 javaFX 없이 순저히 awt만을 이용하였기에 괜시리 코드가 더 길어진듯하다.

나름 비슷한 항목끼리는 나눴지만 awt의 GUI는 정말 노답..