본문 바로가기
Project

[Toy project - 1] Java의 GUI Swing을 활용한 도서 처리 프로그램

by Dream Jin 2022. 5. 30.

[Toy project - 1] Java의 GUI Swing을 활용한 도서 처리 프로그램

1. 서론

1-1. 프로그램 설명

학교 과제로 수행하였던 프로젝트였는데, 욕심이 생겨서 조금 더 구현하여 작성해 보았습니다. JAVA연습으로 JAVA의 GUI인 Swing을 활용한 도서 처리 프로그램 입니다.

1-2. 프로그램 개발 환경

OS : Window pro 10 version
JAVA : JAVA 17.0.2 version
IDE : eclipse 21-09(4.21.0) version (수월한 개발을 위해 이클립스의 Window Builder Plug in을 이용하였습니다.)
DB : MySQL (간단한 hosting 서비스인 freemysqlhosting.net을 이용하였습니다.)

1-3. Class Diagram

1) ImagePanel

  • customer_App에서 사용되는 Image Panel의 설정을 해당 클래스에서 관리

2) User

  • 회원가입시 사용되는 객체들을 관리하는 클래스

3) UserManager

  • 회원가입시 TextArea에 입력되는 각 입력값들을 받아 data.csv 파일로 전송, 저장하고 LinkedHashMap 자료구조를 통해 해당 키,값을 이용하여 해당 값을 통째로 반환해주는 클래스

4) Customer

  • 책의 정보가 들어가는 DB와 연결 시켜주는 역할의 클래스로서, MYSQL의 정보 값을 통해 DATABASE를 연결하고, table생성, SQL문법에 따라 입력되는 값들을 DB로 전송하는 클래스

5) customer_App

  • 대부분의 기능을 수행하는 클래스, 각 패널, 객체 들을 관리하고 프로젝트의 프론트 엔드, 백엔드 를 모두 담당하고 있다.
    LoginPanel에서 UserManager 클래스를 통해 로그인이 일어나고, joinPanel에서 UserManager 클래스를 통한 회원가입, mainPanel에서 책의 정보들을 DB로 전송, ListPanel에서 DB의 자료 즉 책의 정보들을 확인할수 있는 클래스

1-4. 초기 구현 계획

1) Login Panel

기능 구현 여부
전체 login 기능 O
관리자 login 기능 X
회원가입 기능 O

2) joinPanel

기능 구현 여부
DB를 통한 회원 정보 관리 △(DB연동 실패 후 간단한 파일 입출력을 이용하여 .csv파일을 이용)
데이터 입력 후 회원 가입 O
회원 가입 완료후 MessageBox 출력 후 LoginPanel 이동 O

3) mainPanel

기능 구현 여부
관리자만 선택 가능한 관리자기능 X
DB를 통한 책 정보 관리 O
책 추가가 완료되면 MessageBox 출력 후 ListPanel 이동 O

4) ListPanel

기능 구현 여부
책 목록 확인 O(Table이용)
책 검색 기능 O
책을 클릭하면 상세정보 확인 X
정책을 통해 책의 대출, 반납 기능 X

2. 본론(코드)

2-1) ImagePanel.java

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JPanel;

class ImagePanel extends JPanel{
    private Image img; // JPanel의 함수를 사용하기위해 전역 설정

    public ImagePanel(Image img) {
        this.img = img; //사이즈만 정함
        setSize(new Dimension(img.getWidth(null),img.getHeight(null)));
        setPreferredSize(new Dimension(img.getWidth(null),img.getHeight(null)));
        setLayout(null);
    }

    public int getWidth() {
        return img.getWidth(null);
    }

    public int getHeight() {
        return img.getHeight(null);
    }

    public void paintComponent(Graphics g) { //자동으로 백그라운드 이미지 설정
        g.drawImage(img, 0, 0, null);
    }
}

2-2) User.java

import java.io.File;
import java.io.FileWriter;

import javax.swing.JOptionPane;

public class User  {
    public String studentName;
    public String studentNumber;
    public String grade;
    public String studentID;
    public String studentPW;
    public String phoneNumber;
    public String email;
    public String address;
}
    // 회원가입 데이터 생성

2-3) UserManager.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedHashMap;

class UserManager {
    private static UserManager instance = new UserManager();
    public static UserManager getInstance() {
    return instance;
    }

    private File file;

    private LinkedHashMap<String, User> users = new LinkedHashMap<String, User>();
    //LinkedHashMap 자료구조는 HashMap 자료구조에서 자동으로 섞이는거를 순서를 유지시켜 준다.
    //키, 값을 통해 저장되어 있는 정보들중 해당하는 값을 찾아낸다.

    //UserManager에서 입력받은 정볼르 data.csv로 뽑아내기
    public UserManager() {
        file = new File("./data.csv");
        if(file.exists()) {
            load();
        }
    }
    //data.csv 파일을 읽어와서 , ","로 split 함수로 문자열을 구분하고, 토큰에 저장한다. 
    //즉 한줄씩 통째로 읽어들임

    public void load() {
        try {
            var fr = new FileReader(file);
            var br = new BufferedReader(fr);
            String line = br.readLine();
            while((line = br.readLine()) != null) {
                String[] tokens = line.split(","); //,를 기준으로 문자열을 자른다

                User user = new User();
                user.studentName = tokens[0];
                user.studentNumber = tokens[1];
                user.grade = tokens[2];
                user.studentID = tokens[3];
                user.studentPW = tokens[4];
                user.phoneNumber = tokens[5];
                user.email = tokens[6];
                user.address = tokens[7];

                System.out.println(user.studentName);

                users.put(user.studentID, user);
            }

            br.close();
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //저장한다.
    public void save() {
        // StudentName,StudentNumber,Grade,StudentID,StudentPW,PhoneNumber,Email,Address
        try {
            FileWriter fw = new FileWriter(file);
            fw.append("StudentName,StudentNumber,Grade,StudentID,StudentPW,PhoneNumber,Email,Address\n");

            for(var entry : users.entrySet()) {
                User user = entry.getValue();

                String[] tokens = new String[]{
                    user.studentName,
                    user.studentNumber,
                    user.grade,
                    user.studentID,
                    user.studentPW,
                    user.phoneNumber,
                    user.email,
                    user.address
                };

                fw.append(String.join(",", tokens) + "\n"); //한줄씩 구분하여 데이터 구분
            }
            fw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //ID값을 찾고
    public User getUser(String studentID) {
        return users.get(studentID);
    }

    //키, 값을 통해 값 통째로 저장한다.
    public void createUser(User user) {
        users.put(user.studentID, user);
        save();
    }
}

2-4) Customer.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
//SQL DataBase와 연결

public class Customer {
    public static void main(String[] args) {
        createTable();
    }
    //사용을 위해서 해당프로젝트에 mysqldbconnetor생성 필요
     //SQL문법에 맞추어 입력되는 값들을 DB로 전송한다
    public static String [][] getCustomers(){
        try{
            Connection con = getConnection();
            PreparedStatement statement = con.prepareStatement("Select name, author, booknumber, publisher, category, introduction FROM customer");
            ResultSet results = statement.executeQuery();
            ArrayList<String[]> list = new ArrayList<String[]>();
            while(results.next()){
                list.add(new String[] {
                        results.getString("name"),
                        results.getString("author"),
                        results.getString("booknumber"),
                        results.getString("publisher"),
                        results.getString("category"),
                        results.getString("introduction"),
                });
            }
            System.out.println("The data has been fetched");
            String[][] arr = new String[list.size()][5];
            return list.toArray(arr);

        }catch(Exception e){
            System.out.println(e.getMessage());
            return null;
        }
    }

    // 테이블에 Header추가
    public static void createCustomer(String name, String author, String booknumber, String publisher, String category, String introduction){
        try{
            Connection con = getConnection();
            PreparedStatement insert = con.prepareStatement(""
                    + "INSERT INTO customer"
                    + "(name, author, booknumber, publisher, category, introduction) "
                    + "VALUE "
                    + "('"+name+"','"+author+"','"+booknumber+"','"+publisher+"','"+category+"','"+introduction+"')");
            insert.executeUpdate();
            System.out.println("The data has been saved!");
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
    }

    //Table 생성
    public static void createTable(){
        try{
            Connection con = getConnection();
            PreparedStatement create = con.prepareStatement(
                    "CREATE TABLE IF NOT EXISTS "
                    + "customer(id int NOT NULL AUTO_INCREMENT,"
                    + "name varChar(255),"
                    + "author varChar(255),"
                    + "booknumber varChar(255),"
                    + "publisher varChar(255),"
                    + "category varChar(255),"
                    + "introduction varChar(255),"
                    + "PRIMARY KEY(id))");
            create.execute();
        }catch(Exception e){
            System.out.println(e.getMessage());
        }finally{
            System.out.println("Table successfully created");
        }
    }
    //MYSQL 연결
    public static Connection getConnection() {
        try {
            String driver = "freemysqlhosting 사용"; 
            String url = "개인 서버 url";
            String user = "usr ID";
            String pass ="usr PW";
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url,user,pass);
            System.out.println("The Connection Succesful");
            return con;
        }catch(Exception e) {
            System.out.println(e.getMessage());
            return null;
        }
    } 
}

2-5) customer_App.java

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.FileWriter;
import java.util.Arrays;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.SwingConstants;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class customer_App {
    private JFrame frame;
    private JTextField id;
    private JPasswordField pw;
    private JTextField name;
    private JTextField publisher;
    private JTextField booknumber;
    private JTextField author;
    private JTextField search;
    private JPanel currPanel;
    public JTextField studentname;
    public JTextField studentnumber;
    public JTextField grade;
    public JTextField phonenumber;
    public JTextField email;
    public JTextField studentid;
    public JTextField studentpw;
    public JTextArea address;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    customer_App window = new customer_App();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public customer_App() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        Customer customer = new Customer();

        frame = new JFrame();
        frame.setSize(803,538);
        frame.getContentPane().setLayout(null);
        String[][] data = customer.getCustomers();
        String[] headers = new String[] {"Name", "Author", "BookNumber", "Publisher", "Category", "Introduction"};

        이 필요
        ImagePanel ListPanel = new ImagePanel(new ImageIcon("List.jpg 경로").getImage());
        ListPanel.setBounds(0, 0, 787, 476);
        ListPanel.setVisible(false);
        ImagePanel LoginPanel = new ImagePanel(new ImageIcon("welcome.jpg 경로").getImage()); 
        ImagePanel mainPanel = new ImagePanel(new ImageIcon("Administrator.jpg 경로").getImage());
        JPanel joinPanel = new JPanel();
        joinPanel.setVisible(false);
        //패널을 이동하여 window builder에서 수정시 자꾸 오류가 발생하여 Panel만 위로 뺏다.

        //Label setting
        joinPanel.setBounds(0, 0, 787, 476);
        frame.getContentPane().add(joinPanel);
        joinPanel.setLayout(null);

        //JLabel Front End
        JLabel studentnameL = new JLabel("StudentName");
        studentnameL.setFont(new Font("맑은 고딕", Font.BOLD, 15));
        studentnameL.setBounds(12, 27, 180, 44);
        joinPanel.add(studentnameL);

        JLabel studentnumberL = new JLabel("StudentNumber");
        studentnumberL.setFont(new Font("맑은 고딕", Font.BOLD, 15));
        studentnumberL.setBounds(12, 108, 180, 44);
        joinPanel.add(studentnumberL);

        JLabel gradeL = new JLabel("Grade\r\n");
        gradeL.setFont(new Font("맑은 고딕", Font.BOLD, 15));
        gradeL.setBounds(12, 186, 180, 44);
        joinPanel.add(gradeL);

        JLabel phonenumberL = new JLabel("PhoneNumber");
        phonenumberL.setFont(new Font("맑은 고딕", Font.BOLD, 15));
        phonenumberL.setBounds(372, 27, 180, 44);
        joinPanel.add(phonenumberL);

        JLabel emailL = new JLabel("Email");
        emailL.setFont(new Font("맑은 고딕", Font.BOLD, 15));
        emailL.setBounds(372, 108, 180, 44);
        joinPanel.add(emailL);

        JLabel addressL = new JLabel("Address");
        addressL.setFont(new Font("맑은 고딕", Font.BOLD, 15));
        addressL.setBounds(372, 186, 180, 44);
        joinPanel.add(addressL);

        //TextField setting
        studentname = new JTextField();
        studentname.setBounds(136, 31, 202, 44);
        joinPanel.add(studentname);
        studentname.setColumns(10);

        studentnumber = new JTextField();
        studentnumber.setColumns(10);
        studentnumber.setBounds(136, 112, 202, 44);
        joinPanel.add(studentnumber);

        grade = new JTextField();
        grade.setColumns(10);
        grade.setBounds(136, 186, 202, 44);
        joinPanel.add(grade);

        phonenumber = new JTextField();
        phonenumber.setColumns(10);
        phonenumber.setBounds(497, 31, 278, 44);
        joinPanel.add(phonenumber);

        email = new JTextField();
        email.setColumns(10);
        email.setBounds(497, 112, 278, 44);
        joinPanel.add(email);

        JTextArea address_1 = new JTextArea();
        address_1.setBounds(497, 186, 278, 122);
        joinPanel.add(address_1);


        //회원가입 버튼 구현
        JButton signupbtn = new JButton("Sign up");
        signupbtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    //user 클래스에서 불러오기
                    User user = new User();
                    user.studentName = studentname.getText();
                    user.studentNumber = studentnumber.getText();
                    user.grade = grade.getText();
                    user.studentID = studentid.getText();
                    user.studentPW = studentpw.getText();
                    user.phoneNumber = phonenumber.getText();
                    user.email = email.getText();
                    user.address = address_1.getText();

                    UserManager.getInstance().createUser(user);
                    //UserManager이후 TextField값 비워주기
                    studentname.setText("");
                    studentnumber.setText("");
                    grade.setText("");
                    studentid.setText("");
                    studentpw.setText("");
                    phonenumber.setText("");
                    email.setText("");
                    address_1.setText("");
                    JOptionPane.showMessageDialog(null, "Data Saved Succesfully");

                    //회원가입 성공후 loginPanel로 
                    joinPanel.setVisible(false);
                    LoginPanel.setVisible(true);

                }catch(Exception e1) {
                    JOptionPane.showMessageDialog(null, "There was an error while writing the data"); //오류
                }


            }
        });
        //Login Panel Front end
        signupbtn.setFont(new Font("함초롬돋움", Font.BOLD, 30));
        signupbtn.setBounds(372, 357, 379, 87);
        joinPanel.add(signupbtn);

        studentid = new JTextField();
        studentid.setColumns(10);
        studentid.setBounds(136, 264, 202, 44);
        joinPanel.add(studentid);

        JLabel studentidL = new JLabel("StudentID");
        studentidL.setFont(new Font("맑은 고딕", Font.BOLD, 15));
        studentidL.setBounds(12, 264, 180, 44);
        joinPanel.add(studentidL);

        JLabel studentpwL = new JLabel("StudentPW");
        studentpwL.setFont(new Font("맑은 고딕", Font.BOLD, 15));
        studentpwL.setBounds(12, 343, 180, 44);
        joinPanel.add(studentpwL);

        studentpw = new JTextField();
        studentpw.setColumns(10);
        studentpw.setBounds(136, 343, 202, 44);
        joinPanel.add(studentpw);

        mainPanel.setBackground(Color.WHITE);
        mainPanel.setBounds(0, 0, 787, 476);
        frame.getContentPane().add(mainPanel);
        mainPanel.setLayout(null);
        mainPanel.setVisible(false);

        //Administrator JLable Front End
        JLabel lblNewLabel_2 = new JLabel("PKNU librarian Page");
        lblNewLabel_2.setFont(new Font("함초롬돋움", Font.BOLD, 20));
        lblNewLabel_2.setBounds(222, 0, 301, 62);
        mainPanel.add(lblNewLabel_2);

        JLabel NameL = new JLabel("Name");
        NameL.setHorizontalAlignment(SwingConstants.CENTER);
        NameL.setFont(new Font("함초롬돋움", Font.PLAIN, 20));
        NameL.setBounds(244, 51, 95, 51);
        mainPanel.add(NameL);

        JLabel BookNumberL = new JLabel("BookNumber");
        BookNumberL.setHorizontalAlignment(SwingConstants.CENTER);
        BookNumberL.setFont(new Font("함초롬돋움", Font.PLAIN, 20));
        BookNumberL.setBounds(180, 112, 183, 51);
        mainPanel.add(BookNumberL);

        JLabel CategoryL = new JLabel("Category");
        CategoryL.setHorizontalAlignment(SwingConstants.CENTER);
        CategoryL.setFont(new Font("함초롬돋움", Font.PLAIN, 20));
        CategoryL.setBounds(446, 164, 183, 51);
        mainPanel.add(CategoryL);

        JLabel PublisherL = new JLabel("Publisher");
        PublisherL.setHorizontalAlignment(SwingConstants.CENTER);
        PublisherL.setFont(new Font("함초롬돋움", Font.PLAIN, 20));
        PublisherL.setBounds(446, 51, 183, 51);
        mainPanel.add(PublisherL);

        JLabel AuthorL = new JLabel("Author");
        AuthorL.setHorizontalAlignment(SwingConstants.CENTER);
        AuthorL.setFont(new Font("함초롬돋움", Font.PLAIN, 20));
        AuthorL.setBounds(456, 103, 183, 51);
        mainPanel.add(AuthorL);

        JLabel IntroductionL = new JLabel("Introduction");
        IntroductionL.setHorizontalAlignment(SwingConstants.CENTER);
        IntroductionL.setFont(new Font("함초롬돋움", Font.PLAIN, 20));
        IntroductionL.setBounds(206, 164, 183, 51);
        mainPanel.add(IntroductionL);

        //administrator textField Front End
        name = new JTextField();
        name.setFont(new Font("나눔고딕", Font.PLAIN, 18));
        name.setBounds(335, 64, 138, 38);
        mainPanel.add(name);
        name.setColumns(10);

        publisher = new JTextField();
        publisher.setFont(new Font("나눔고딕", Font.PLAIN, 18));
        publisher.setColumns(10);
        publisher.setBounds(592, 64, 183, 38);
        mainPanel.add(publisher);

        booknumber = new JTextField();
        booknumber.setFont(new Font("나눔고딕", Font.PLAIN, 18));
        booknumber.setColumns(10);
        booknumber.setBounds(334, 116, 139, 38);
        mainPanel.add(booknumber);

        author = new JTextField();
        author.setFont(new Font("나눔고딕", Font.PLAIN, 18));
        author.setColumns(10);
        author.setBounds(592, 112, 183, 38);
        mainPanel.add(author);

        //category combobox
        JComboBox category = new JComboBox(new String[] {"humanities", "Operation", "literature", "technology", "magazine"});
        category.setFont(new Font("나눔고딕", Font.PLAIN, 18));
        category.setEditable(true);
        category.setBackground(Color.WHITE);
        category.setBounds(592, 170, 183, 45);
        mainPanel.add(category);

        JTextArea introduction = new JTextArea();
        introduction.setBounds(233, 220, 290, 214);
        introduction.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        mainPanel.add(introduction);

        //추가하기 버튼을 누르면 dB로 데이터 전송
        JButton Submitbtn = new JButton("\uC800\uC7A5");
        Submitbtn.addActionListener(new ActionListener() { //버튼을 누르면 입력된 string값을 받음 이후 DB로 전송
            public void actionPerformed(ActionEvent e) {
                String nameTxt = name.getText();
                String authorTxt = author.getText();
                String booknumberTxt = booknumber.getText();
                String publisherTxt = publisher.getText();
                String categoryTxt = category.getSelectedItem().toString();
                String introductionTxt = introduction.getText();

                Customer.createCustomer(nameTxt, authorTxt, booknumberTxt, publisherTxt, categoryTxt, introductionTxt);
                JOptionPane.showMessageDialog(null, "Your data has been saved successfully");
                mainPanel.setVisible(false);
                ListPanel.setVisible(true);
            }
        });
        Submitbtn.setBounds(572, 244, 164, 77);
        mainPanel.add(Submitbtn);

        //List btn
        JButton listbtn = new JButton("");
        listbtn.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        listbtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                currPanel.setVisible(false);
                ListPanel.setVisible(true);
                currPanel = ListPanel;
                //currPanel을 통해 버튼이 눌러지되, 작동은 안하도록설정
            }
        });


        listbtn.setIcon(new ImageIcon("Listbtn1.jpg 경로"));
        listbtn.setBounds(42, 31, 152, 62);
        mainPanel.add(listbtn);
        ListPanel.setLayout(null);
        JTable table = new JTable(data, headers);
        table.setRowHeight(30);
        table.setFont(new Font("Sanserif",  Font.BOLD, 15));
        table.setAlignmentX(0);
        table.setSize(600,400);
        table.setPreferredScrollableViewportSize(new Dimension(600,400));
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setBounds(219, 24, 556, 305);
        ListPanel.add(scrollPane);
        frame.getContentPane().add(ListPanel);

        search = new JTextField();
        search.setHorizontalAlignment(SwingConstants.CENTER);
        search.setText("\uAC80\uC0C9");
        search.setFont(new Font("나눔고딕", Font.BOLD, 25));
        search.setBounds(219, 352, 392, 63);
        ListPanel.add(search);
        search.setColumns(10);

        //addministrator btn    
        //현재 로그인되어 있는 ID가 뭐지 확인하기 
        //로그인되어 있는 ID가 root이면 administrator
        JButton addbtn = new JButton("");
        addbtn.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        addbtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                currPanel.setVisible(false);
                mainPanel.setVisible(true);
                currPanel = mainPanel;
            }
        });

        addbtn.setIcon(new ImageIcon("Administratorbtn1.jp 경로"));
        addbtn.setBounds(35, 141, 172, 63);
        ListPanel.add(addbtn);

        currPanel = LoginPanel; //현재 패널을 로그인패널로 설정

        LoginPanel.setBounds(0, 0, 787, 476);
        frame.getContentPane().add(LoginPanel);

        JLabel lblNewLabel = new JLabel("Log In");
        lblNewLabel.setFont(new Font("나눔고딕", Font.BOLD, 53));
        lblNewLabel.setBounds(52, 0, 227, 132);
        LoginPanel.add(lblNewLabel);

        id = new JTextField();
        id.setFont(new Font("맑은 고딕", Font.PLAIN, 24));
        id.setHorizontalAlignment(SwingConstants.LEFT);
        id.setToolTipText("");
        id.setBounds(97, 121, 158, 32);
        LoginPanel.add(id);
        id.setColumns(10);

        pw = new JPasswordField();
        pw.setBounds(97, 163, 158, 32);
        LoginPanel.add(pw);

        JLabel lblNewLabel_1 = new JLabel("ID : ");
        lblNewLabel_1.setFont(new Font("맑은 고딕", Font.BOLD, 30));
        lblNewLabel_1.setBounds(39, 117, 70, 37);
        LoginPanel.add(lblNewLabel_1);

        JLabel lblNewLabel_1_1 = new JLabel("PW: ");
        lblNewLabel_1_1.setFont(new Font("맑은 고딕", Font.BOLD, 30));
        lblNewLabel_1_1.setBounds(37, 158, 94, 37);
        LoginPanel.add(lblNewLabel_1_1);


        //login btn
        JButton btnLogin = new JButton("");
        btnLogin.setIcon(new ImageIcon("loginbutton4.jpg 경로"));
        btnLogin.setPressedIcon(new ImageIcon("loginbutton5.jpg 경로"));

        //버튼이 눌러지면 색깔이 바뀐다
        //실질적인 기능 구현
        btnLogin.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                User user = UserManager.getInstance().getUser(id.getText());
                if (user == null) { //아무것도 없을때는 null값을 반환하므로 csv 파일에 일치하는 값이 없을때 null값으로 비교
                    JOptionPane.showMessageDialog(null, "ID does not Exist");
                }else {
                    if(!String.valueOf(pw.getPassword()).equals(user.studentPW)) { //PasswordField의 경우 equals 함수로 비교
                        JOptionPane.showMessageDialog(null, "Passwords do not match");
                    }else {
                        JOptionPane.showMessageDialog(null, "You success logd in");
                        mainPanel.setVisible(false);
                        ListPanel.setVisible(true);
                    }
                }

                //초기 CSV에서 파일을 읽어와서 구현하기전, 아이디를 설정해서 로그인ID와 
                /*    if(id.getText().equals("root")&&Arrays.equals(pw.getPassword(),"root".toCharArray())) { //id는 string값 이므로 equal로 비교
                    System.out.println("관리자님 반갑습니다.");
                    mainPanel.setVisible(false);
                    ListPanel.setVisible(true);
                    } else {
                    JOptionPane.showMessageDialog(null, "You failed to logd in");
                    } */
            }
        });

        btnLogin.setFont(new Font("굴림", Font.PLAIN, 16));
        btnLogin.setBounds(64, 205, 191, 42);
        LoginPanel.add(btnLogin);

        //joinPanel
        JButton joinbtn = new JButton("Sign Up");
        joinbtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                LoginPanel.setVisible(false);
                joinPanel.setVisible(true);
            }
        });


        joinbtn.setFont(new Font("굴림", Font.BOLD | Font.ITALIC, 15));
        joinbtn.setBounds(64, 257, 191, 23);
        LoginPanel.add(joinbtn);


        //search기능 구현
        search.addKeyListener(new KeyAdapter() {
            public void keyReleased(KeyEvent e) {
                String val = search.getText();
                TableRowSorter<TableModel> trs = new TableRowSorter<>(table.getModel());
                table.setRowSorter(trs);
                trs.setRowFilter(RowFilter.regexFilter(val));
            }
        });

    }

    //메뉴바 Exit기능 구현
    public JMenuBar menuBar() {
        JMenuBar bar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        JMenu aboutMenu = new JMenu("About");

        bar.add(fileMenu);
        bar.add(aboutMenu);

        JMenuItem openFile = new JMenuItem("Open");
        JMenuItem exit = new JMenuItem("Exit");
        fileMenu.add(openFile);
        fileMenu.addSeparator();
        fileMenu.add(exit);

        exit.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }

        });

        return bar;
    }
}

2. 본론 (실행 결과)

1) Login 창

2) sign up 버튼을 통한 회원가입

  • 회원가입이 되면 data.csv 파일로 data가 전송 된다.

3) 회원가입 성공

  • 회원가입에 성공하면 데이터가 성공적으로 저장되었다는 MessageBox 출력

4) 성공적으로 회원가입 된 후 Data.csv 파일

  • 위쪽은 회원가입 전 data파일이고, 아래쪽은 회원가입 후 data 파일이다. 회원가입 후 Kimjingeun의 admin 계정이 추가되었다.

5) 해당 계정으로 로그인 성공

  • 로그인에 성공하였다는 MessageBox 출력

6) 로그인 실패시

  • 어떤 이유로 로그인에 실패하였는지 MessageBox로 출력

7) 로그인 후 administrator 탭에서 책 추가 하기

  • 입력된 정보는 연동시킨 MySQL DB로 전송된다.

8) 성공적으로 책 추가

  • 성공적으로 책이 추가되었다는 MessageBox 출력

9) 책 추가 전,후 List탭 확인

  • 왼쪽과 비교하여 JAVA가 추가된 것을 확인할 수 있다.

10) 도서목록 Search

  • 아래쪽 검색 Area를 통해 Keyword를 입력하면 해당 도서가 검색이 된다.

11) Exit logout

  • 메뉴바에서 구현한 Exit기능을 토대로 logout

3. 결론 (소감)

우선 첫번째로는, 학교 과제로 맨처음에 간단하게 프로젝트가 주어졌었는데 직접 하다보니 생각보다 많이 어려웠던 것 같습니다. 아직 잘몰라서 Youtube 강의를 보고 따라하며 기능 하나하나 구현하다 보니 조금 더 공부가 많이 되었던 것 같고, Swing을 통하여 JAVA를 전체적으로 한번 더 공부해볼수 있어서 좋았던 것 같습니다. 아직 실력이 많이 부족하여 코드도 엉망이고, 구현하지 못한 부분들도 많이 있지만 앞으로 열심히 공부하며 성장가능성 있는 개발자임을 증명하고 싶습니다! 이번 프로젝트를 통해 JAVA와 MySQL 문법에 대하여 경험할수 있었습니다.

3. 결론 (추가구현 계획)

우선 초기에 계획했던 부분에서 구현하지 못한 부분들을 구현할 예정 입니다.

  1. 관리자 로그인 기능
  2. 회원정보 관리 DB연동 (csv 파일에서, DB로 수정 예정)
  3. 책 정보 상세보기 (이미지, 책설명, 보관 장소 등등)
  4. 책 대출,반납 기능 추가
  5. 클래스 분리를 통한 코드 관리

진근이의 개발 일기 Vlog

References
Danny TWLC 님의 유튜브 강의를 보고 구현 하였습니다.

댓글