Java Day 21 CMS 구현 - GUI
05 Jan 2021 | JavaJava Day 21 CMS 구현 - GUI
- 들어가며
지난번 CMS는 GUI 없이 텍스트형태로만 작동하는 프로그램이었다면 이번엔 java awt로 GUI를 구현하여 조금 더 소프트웨어적인 형태를 띈 CMS를 구현했다. 정식 명칭은 FMS (Friend Manager System)이지만 간단한 프로그램이므로 쓰임에따라 얼마든지 CMS가 될 수도 있다.ㅋㅋ;;
- 완성본
우선 완성본 레이아웃을 먼저 보자면
개인정보 입력란이 있고 [등록] 버튼을 누르면 전체 목록에 리스트가 올라간다. [분석] 과 기본적인 시스템상 메시지는 개인정보 분석의 text area에 출력된다.
[File]과 [Help] 두 메뉴가 있고 각각 하위 메뉴를 가진다.
[Help]의 [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는 정말 노답..