1+ package main .java .com .example .ui ;
2+
3+ import main .java .com .example .model .Resume ;
4+ import main .java .com .example .model .WorkExperience ;
5+ import javax .swing .*;
6+ import java .awt .*;
7+ import java .util .Date ;
8+ import java .text .SimpleDateFormat ;
9+
10+ public class ResumeApp extends JFrame {
11+ private Resume .ResumeService resumeService = new Resume .ResumeService ();
12+ private DefaultListModel <String > listModel = new DefaultListModel <>();
13+ private JList <String > resumeList = new JList <>(listModel );
14+
15+ public ResumeApp () {
16+ setTitle ("이력서 리스트" );
17+ setSize (600 , 500 );
18+ setDefaultCloseOperation (JFrame .EXIT_ON_CLOSE );
19+ setLayout (new BorderLayout ());
20+
21+ JButton addButton = new JButton ("추가" );
22+ JButton editButton = new JButton ("수정" );
23+ JButton detailButton = new JButton ("상세보기" );
24+ JButton deleteButton = new JButton ("삭제" );
25+ JPanel buttonPanel = new JPanel ();
26+ buttonPanel .add (addButton );
27+ buttonPanel .add (editButton );
28+ buttonPanel .add (detailButton );
29+ buttonPanel .add (deleteButton );
30+
31+ add (new JScrollPane (resumeList ), BorderLayout .CENTER );
32+ add (buttonPanel , BorderLayout .SOUTH );
33+
34+ addButton .addActionListener (e -> showFormDialog (new Resume ("" , "" , "" , "" , "" ), false ));
35+ editButton .addActionListener (e -> {
36+ int selectedIndex = resumeList .getSelectedIndex ();
37+ if (selectedIndex != -1 ) {
38+ Resume resume = resumeService .getResumes ().get (selectedIndex );
39+ showFormDialog (resume , true );
40+ } else {
41+ JOptionPane .showMessageDialog (this , "수정할 이력서를 선택하세요." , "오류" , JOptionPane .ERROR_MESSAGE );
42+ }
43+ });
44+
45+ detailButton .addActionListener (e -> {
46+ int selectedIndex = resumeList .getSelectedIndex ();
47+ if (selectedIndex != -1 ) {
48+ Resume resume = resumeService .getResumes ().get (selectedIndex );
49+ JOptionPane .showMessageDialog (this , resume .toDetailString (), "이력서 상세보기" , JOptionPane .INFORMATION_MESSAGE );
50+ }
51+ });
52+
53+ deleteButton .addActionListener (e -> {
54+ int selectedIndex = resumeList .getSelectedIndex ();
55+ if (selectedIndex != -1 ) {
56+ resumeService .getResumes ().remove (selectedIndex );
57+ listModel .remove (selectedIndex );
58+ JOptionPane .showMessageDialog (this , "이력서가 성공적으로 삭제되었습니다." );
59+ }
60+ });
61+ }
62+
63+ private void showFormDialog (Resume resume , boolean isEdit ) {
64+ JDialog dialog = new JDialog (this , isEdit ? "이력서 수정" : "이력서 추가" , true );
65+ dialog .setSize (400 , 600 );
66+ dialog .setLayout (new GridLayout (12 , 2 ));
67+
68+ JTextField titleField = new JTextField (resume .title );
69+ JTextField addressField = new JTextField (resume .address );
70+ JTextField phoneField = new JTextField (resume .phoneNumber );
71+ JTextField instagramField = new JTextField (resume .instagram );
72+ JTextField workPlaceField = new JTextField ();
73+ JTextField workContentField = new JTextField ();
74+ JTextField startDateField = new JTextField ("yyyy-MM-dd" );
75+ JTextField endDateField = new JTextField ("yyyy-MM-dd" );
76+
77+ dialog .add (new JLabel ("제목:" ));
78+ dialog .add (titleField );
79+ dialog .add (new JLabel ("주소:" ));
80+ dialog .add (addressField );
81+ dialog .add (new JLabel ("전화번호:" ));
82+ dialog .add (phoneField );
83+ dialog .add (new JLabel ("인스타그램:" ));
84+ dialog .add (instagramField );
85+
86+ dialog .add (new JLabel ("직장명:" ));
87+ dialog .add (workPlaceField );
88+ dialog .add (new JLabel ("업무 내용:" ));
89+ dialog .add (workContentField );
90+ dialog .add (new JLabel ("시작 날짜:" ));
91+ dialog .add (startDateField );
92+ dialog .add (new JLabel ("종료 날짜:" ));
93+ dialog .add (endDateField );
94+
95+ JButton saveButton = new JButton ("저장" );
96+ dialog .add (saveButton );
97+
98+ saveButton .addActionListener (e -> {
99+ resume .title = titleField .getText ();
100+ resume .address = addressField .getText ();
101+ resume .phoneNumber = phoneField .getText ();
102+ resume .instagram = instagramField .getText ();
103+
104+ try {
105+ Date startDate = new SimpleDateFormat ("yyyy-MM-dd" ).parse (startDateField .getText ());
106+ Date endDate = new SimpleDateFormat ("yyyy-MM-dd" ).parse (endDateField .getText ());
107+ int newId = resume .workExperience .size () + 1 ; // 자동 증가 ID
108+ resume .workExperience .add (new WorkExperience (newId , workPlaceField .getText (), startDate , endDate , workContentField .getText ()));
109+ } catch (Exception ex ) {
110+ JOptionPane .showMessageDialog (dialog , "유효하지 않은 날짜 형식입니다." , "오류" , JOptionPane .ERROR_MESSAGE );
111+ return ;
112+ }
113+
114+ if (!isEdit ) {
115+ resumeService .addResume (resume );
116+ listModel .addElement (resume .toString ());
117+ } else {
118+ listModel .setElementAt (resume .toString (), resumeList .getSelectedIndex ());
119+ }
120+ dialog .dispose ();
121+ });
122+
123+ dialog .setVisible (true );
124+ }
125+
126+ public static void main (String [] args ) {
127+ SwingUtilities .invokeLater (() -> new ResumeApp ().setVisible (true ));
128+ }
129+ }
0 commit comments