StudentFrameApp
StudentDialog
값을 행과 열로 구성된 테이블(Table - 표) 형식으로 출력하는 컴포넌트를 생성하기 위한 클래스
JTable(TableModel tm) 생성자를 사용하여 객체 생성
테이블(JTable 객체)의 행 관련 정보가 저장된 객체를 생성하기 위한 클래스
TableModel 객체를 이용하여 테이블의 행 또는 행의 열(Cell)을 제어하는 메소드 제공
DefaultTableModel(Object[ ] columnNames, int rows) 생성자를 사용하여 객체 생성
columnNames 매개변수에는 테이블의 컬럼명이 저장된 배열을 전달받고 rows 매개변수에는 행의 갯수를 전달하여 객체 생성
String[] columnNames={"학번", "이름", "전화번호"};
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, "학생추가");
}
}
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);
}
}
}
}