Eclipse로 UI 제작

  • StudentFrameApp

  • StudentDialog


JTable (붕어빵 틀)

  • 값을 행과 열로 구성된 테이블(Table - 표) 형식으로 출력하는 컴포넌트를 생성하기 위한 클래스

  • JTable(TableModel tm) 생성자를 사용하여 객체 생성

    • tm 매개변수 TableModel 객체를 전달 JTable 객체에 컬러명과 행 출력 처리

DefaultTableModel (붕어빵)

  • 테이블(JTable 객체)의 행 관련 정보가 저장된 객체를 생성하기 위한 클래스

  • TableModel 객체를 이용하여 테이블의 행 또는 행의 열(Cell)을 제어하는 메소드 제공

  • DefaultTableModel(Object[ ] columnNames, int rows) 생성자를 사용하여 객체 생성

  • columnNames 매개변수에는 테이블의 컬럼명이 저장된 배열을 전달받고 rows 매개변수에는 행의 갯수를 전달하여 객체 생성

Java CRUD 포인트

  • 테이블의 컬럼명으로 출력되는 부분을 문자열 배열로 작성
    String[] columnNames={"학번", "이름", "전화번호"};

StudentFrameApp(JFrame)

  • CRUD는 코드로 보는게 더 이해가 잘됨
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class StudentFrameApp extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    JTable table;
    private StudentDialog studentDialog;

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

    /**
     * Create the frame.
     */
    public StudentFrameApp() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(700, 200, 500, 400);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));

        JScrollPane scrollPane = new JScrollPane();
        contentPane.add(scrollPane, BorderLayout.CENTER);

        //테이블의 컬럼명으로 출력될 문자열 배열 작성
        String[] columnNames={"학번", "이름", "전화번호"};

        //DefaultTableModel 클래스 : 테이블(JTable 객체)의 행 관련 정보가 저장된 객체를 생성하기 위한 클래스
        // => TableModel 객체를 이용하여 테이블의 행 또는 행의 열(Cell)을 제어하는 메소드 제공
        // => DefaultTableModel(Object[] columnNames, int rows) 생성자를 사용하여 객체 생성
        // => columnNames 매개변수에는 테이블의 컬럼명이 저장된 배열을 전달받고 rows 매개변수에는
        //행의 갯수를 전달하여 객체 생성
        DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0);

        //JTable 클래스 : 값을 행과 열로 구성된 테이블(Table - 표) 형식으로 출력하는 컴퍼넌트를
        //생성하기 위한 클래스
        // => JTable(TableModel tm) 생성자를 사용하여 객체 생성
        // => tm 매개변수에 TableModel 객체를 전달 JTable 객체에 컬럼명과 행 출력 처리
        table = new JTable(tableModel);
        table.setFont(new Font("굴림체", Font.PLAIN, 16));
        scrollPane.setViewportView(table);

        JPanel panel = new JPanel();
        contentPane.add(panel, BorderLayout.SOUTH);

        JButton addButton = new JButton("학생추가");
        addButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                studentDialog.setVisible(true);
            }
        });
        addButton.setFont(new Font("굴림체", Font.BOLD, 20));
        panel.add(addButton);

        JButton removeButton = new JButton("학생삭제");
        removeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                /*
                밑에 처럼 작성안해도 되는데 하는 이유는 tablemodel이 지역변수에 있어서 원래는
                작성하지 않아도 되는데
                이벤트가 발생할 때 테이블의 내용을 가져와서 처리하는게 가독성이 더 좋기 때문에
                다시 한번 불러와서 작성
                */
                DefaultTableModel tableModel = (DefaultTableModel)table.getModel();

                // DefaultTableModel.getRowCount(): DefaultTableModel 객체에 저장된 행의
                // 갯수를 반환하는 메소드
                if(tableModel.getRowCount() == 0){
                    return;
                }
                
                // DefaultTableModel.getSelectRow(): JTable 컴포넌트에 출력된 행에서 선택된 행의
                // 행번호를 반환하는 메소드
                // => 선택행이 없는 경우 [-1] 반환
                int row = table.getSelectedRow();
                if(row == -1){return;}
                
                // DefaultTableModel.removeRow(int row): 매개변수로 전달받은 행번호의 행을
                // DefaultTableModel 객체에서 삭제하는 메소드
                // => JTable 컴포넌트에 출력된 행 삭제 처리
                tableModel.removeRow(row);
            }
        });
        removeButton.setFont(new Font("굴림체", Font.BOLD, 20));
        panel.add(removeButton);

        studentDialog=new StudentDialog(this, "학생추가");
    }

}

StudentDialog(JDialog)

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;

public class StudentDialog extends JDialog {

    private static final long serialVersionUID = 1L;
    private final JPanel contentPanel = new JPanel();
    private JTextField numTF;
    private JTextField nameTF;
    private JTextField phoneTF;

    public StudentDialog(JFrame frame, String title) {
        //부모클래스(JDialog 클래스)의 JDialog(Frame owner, String title, boolean model)
        //생성자를 super 키워드로 호출하여 JDialog 객체 생성
        // => owner 매개변수에는 부모창(JFrame 객체)을 전달받고 model 매개변수에는 부모창의
        //비활성화 여부를 설정하는 논리값(false : 부모창 활성화 - Modeless Dialog, true :
        //부모창 비활성화 - Model Dialog)을 전달받아 JDialog 객체 생성
        super(frame, title, true);

        setBounds(700, 200, 450, 300);
        setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                numTF.setText("");
                nameTF.setText("");
                phoneTF.setText("");
                setVisible(false);
            }
        });

        getContentPane().setLayout(new BorderLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        GridBagLayout gbl_contentPanel = new GridBagLayout();
        gbl_contentPanel.columnWidths = new int[] {100, 300};
        gbl_contentPanel.rowHeights = new int[] {50, 50, 50};
        gbl_contentPanel.columnWeights = new double[]{0.0, 0.0};
        gbl_contentPanel.rowWeights = new double[]{0.0, 0.0, 0.0};
        contentPanel.setLayout(gbl_contentPanel);
        {
            JLabel lblNewLabel = new JLabel("학번");
            lblNewLabel.setFont(new Font("굴림체", Font.BOLD, 20));
            GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
            gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
            gbc_lblNewLabel.gridx = 0;
            gbc_lblNewLabel.gridy = 0;
            contentPanel.add(lblNewLabel, gbc_lblNewLabel);
        }
        {
            numTF = new JTextField();
            numTF.setFont(new Font("굴림체", Font.PLAIN, 20));
            GridBagConstraints gbc_numTF = new GridBagConstraints();
            gbc_numTF.fill = GridBagConstraints.HORIZONTAL;
            gbc_numTF.insets = new Insets(0, 0, 5, 0);
            gbc_numTF.gridx = 1;
            gbc_numTF.gridy = 0;
            contentPanel.add(numTF, gbc_numTF);
        }
        {
            JLabel lblNewLabel_1 = new JLabel("이름");
            lblNewLabel_1.setFont(new Font("굴림체", Font.BOLD, 20));
            GridBagConstraints gbc_lblNewLabel_1 = new GridBagConstraints();
            gbc_lblNewLabel_1.insets = new Insets(0, 0, 5, 5);
            gbc_lblNewLabel_1.gridx = 0;
            gbc_lblNewLabel_1.gridy = 1;
            contentPanel.add(lblNewLabel_1, gbc_lblNewLabel_1);
        }
        {
            nameTF = new JTextField();
            nameTF.setFont(new Font("굴림체", Font.PLAIN, 20));
            GridBagConstraints gbc_nameTF = new GridBagConstraints();
            gbc_nameTF.fill = GridBagConstraints.HORIZONTAL;
            gbc_nameTF.insets = new Insets(0, 0, 5, 0);
            gbc_nameTF.gridx = 1;
            gbc_nameTF.gridy = 1;
            contentPanel.add(nameTF, gbc_nameTF);
        }
        {
            JLabel lblNewLabel_2 = new JLabel("전화번호");
            lblNewLabel_2.setFont(new Font("굴림체", Font.BOLD, 20));
            GridBagConstraints gbc_lblNewLabel_2 = new GridBagConstraints();
            gbc_lblNewLabel_2.insets = new Insets(0, 0, 0, 5);
            gbc_lblNewLabel_2.gridx = 0;
            gbc_lblNewLabel_2.gridy = 2;
            contentPanel.add(lblNewLabel_2, gbc_lblNewLabel_2);
        }
        {
            phoneTF = new JTextField();
            phoneTF.setFont(new Font("굴림체", Font.PLAIN, 20));
            GridBagConstraints gbc_phoneTF = new GridBagConstraints();
            gbc_phoneTF.fill = GridBagConstraints.HORIZONTAL;
            gbc_phoneTF.gridx = 1;
            gbc_phoneTF.gridy = 2;
            contentPanel.add(phoneTF, gbc_phoneTF);
        }
        {
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            getContentPane().add(buttonPane, BorderLayout.SOUTH);
            {
                JButton okButton = new JButton("추가");
                okButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // JTextField 컴포넌트의 입력값을 반환받아 저장
                        String num = numTF.getText();
                        String name = nameTF.getText();
                        String phone = phoneTF.getText();

                        // Vector 객체를 생성하여 입력값을 요소에 저장하여 추가
                        // => Vector 객체가 JTable 컴포넌트의 하나의 행으로 출력처리 => 한 행
                        Vector<String> vector = new Vector<>();
                        vector.add(num);
                        vector.add(name);
                        vector.add(phone);

                        // JTable.getModel(): JTable 컴포넌트에 저장된 TableModel 객체를 반환하는 메소드
                        TableModel tableModel = ((StudentFrameApp)frame).table.getModel();

                        // DefaultTableModel.addRow(Vector vector): Vector 객체를 JTable
                        // 컴포넌트의 행으로 추가하는 메소드
                        // => Vector 객체의 요소값이 행을 구성하는 열의 값으로 처리
                        ((DefaultTableModel)tableModel).addRow(vector);

                        numTF.setText("");
                        nameTF.setText("");
                        phoneTF.setText("");
                        setVisible(false);
                    }
                });
                okButton.setFont(new Font("굴림체", Font.BOLD, 20));
                okButton.setActionCommand("OK");
                buttonPane.add(okButton);
                getRootPane().setDefaultButton(okButton);
            }
            {
                JButton cancelButton = new JButton("취소");
                cancelButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // JTextField 컴포넌트의 입력값 초기화
                        numTF.setText("");
                        nameTF.setText("");
                        phoneTF.setText("");
                        // JDialog 컨테이너 숨김 처리
                        setVisible(false);
                    }
                });
                cancelButton.setFont(new Font("굴림체", Font.BOLD, 20));
                cancelButton.setActionCommand("Cancel");
                buttonPane.add(cancelButton);
            }
        }
    }

}
profile
최선을 다해 꾸준히 노력하는 개발자 망고입니당 :D

0개의 댓글