728x90
반응형
(4) 이벤트 처리
▷ MouseEvent가 발생하므로 MouseListener를 등록해서 이벤트를 처리할 수 있음
▷ getSelectedColumn(), getSelectedRow() 메소드를 이용해 어떤 컬럼과 행에서 클릭되었는지 알아낼 수 있음
import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.table.TableModel; public class JTableExample4 extends JFrame { private JTable jTable; private JPanel pSouth; private JTextField txtName; private JTextField txtAge; private Object[][] rowData; public JTableExample4() { this.setTitle("JTableExample4"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.getContentPane().add(new JScrollPane(getJTable()), BorderLayout.CENTER); this.getContentPane().add(getPSouth(), BorderLayout.SOUTH); this.setSize(200, 230); } // JTable 생성 public JTable getJTable() { if(jTable == null) { String[] columnNames = new String[] { "이름", "나이" }; rowData = new Object[][] { {"춘삼월", 25}, {"하여름", 26}, {"추가을", 22}, {"동겨울", 27} }; jTable = new JTable(rowData, columnNames); // MouseEvent 처리 jTable.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { int rowIndex = jTable.getSelectedRow(); if(rowIndex != -1) { // -1이 아니면 선택한 행이 있음 //선택한 행의 셀 값 읽어 들이기 TableModel tableModel = jTable.getModel(); String name = (String) tableModel.getValueAt(rowIndex, 0); Integer age = (Integer) tableModel.getValueAt(rowIndex, 1); // 읽은 값을 아래쪽에 있는 JPanel에서 보여주기 getTxtName().setText(name); getTxtAge().setText(String.valueOf(age.intValue())); } } }); } return jTable; } // 하단에 위치할 JPanel 생성 public JPanel getPSouth() { if(pSouth == null) { pSouth = new JPanel(); pSouth.setLayout(new GridLayout(4, 2)); pSouth.add(new JLabel("[선택한 행 정보]")); pSouth.add(new JLabel("")); pSouth.add(new JLabel("이름", JLabel.CENTER)); pSouth.add(getTxtName()); pSouth.add(new JLabel("나이", JLabel.CENTER)); pSouth.add(getTxtAge()); } return pSouth; } public JTextField getTxtName() { if(txtName == null) { txtName = new JTextField(); } return txtName; } public JTextField getTxtAge() { if(txtAge == null) { txtAge = new JTextField(); } return txtAge; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JTableExample4 jFram = new JTableExample4(); jFram.setVisible(true); } }); } }
(5) 행 추가, 수정, 삭제
▷ JTable (Object[ ][ ] rowData, String[ ] columnNames ) 생성자로 만들 경우 AbstractTableModel을 상속해서 만들어지 고, 매개변수가 없는 JTable ( ) 생성자로 만들었다면 내부적으로 DefaultTableMode을 상속해서 만듬
◎ 행 추가, 삽입, 삭제할 수 있는 메소드
NO | 타입 | 메소드 | 용도 |
1 | void | addRow(Object[ ][ ] rowData) addRow(Vector rowData) |
맨 뒤에 행 추가 |
2 | void | insertRow(int rowIndex, Object[ ][ ] rowData) insertRow(int rowIndex, Vector rowData) |
주어진 인덱스에 행 삽입 |
3 | void | removeRow(int rowIndex) | 주어진 인덱스의 행 삭제 |
◎ 사용자가 입력한 내용을 JTable의 행으로 삽입, 수정, 삭제하는 예제
import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Vector; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableModel; public class JTableExample5 extends JFrame { private JTable jTable; private JPanel pSouth; private JTextField txtName, txtAge; private JButton btnInsert, btnUpdate, btnDelete; public JTableExample5() { this.setTitle("JTableExample5"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.getContentPane().add(new JScrollPane(getJTable()), BorderLayout.CENTER); this.getContentPane().add(getPSouth(), BorderLayout.SOUTH); this.setSize(250, 250); } // JTable 생성 public JTable getJTable() { if(jTable == null) { jTable = new JTable(); final DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel(); tableModel.addColumn("이름"); tableModel.addColumn("나이"); // 행을 선택했을 때 이벤트 처리 jTable.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { int rowIndex = jTable.getSelectedRow(); if(rowIndex != -1) { String name = (String) tableModel.getValueAt(rowIndex, 0); String age = (String) tableModel.getValueAt(rowIndex, 1); txtName.setText(name); txtAge.setText(age.toString()); } } }); } return jTable; } // 하단에 위치할 JPanel 생성 public JPanel getPSouth() { if(pSouth == null) { pSouth = new JPanel(); pSouth.setLayout(new GridLayout(3, 1)); JPanel pNameInput = new JPanel(); pNameInput.setLayout(new GridLayout(1,2)); pNameInput.add(new JLabel("이름", JLabel.CENTER)); pNameInput.add(getTxtName()); pSouth.add(pNameInput); JPanel pAgeInput = new JPanel(); pAgeInput.setLayout(new GridLayout(1,2)); pAgeInput.add(new JLabel("나이", JLabel.CENTER)); pAgeInput.add(getTxtAge()); pSouth.add(pAgeInput); JPanel pButton = new JPanel(); pButton.add(getBtnInsert()); pButton.add(getBtnUpdate()); pButton.add(getBtnDelete()); pSouth.add(pButton); } return pSouth; } public JTextField getTxtName() { if(txtName == null) { txtName = new JTextField(); } return txtName; } public JTextField getTxtAge() { if(txtAge == null) { txtAge = new JTextField(); } return txtAge; } // 행 삽입 버튼 생성 public JButton getBtnInsert() { if(btnInsert == null) { btnInsert = new JButton(); btnInsert.setText("추가"); btnInsert.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Object[] rowData = { txtName.getText(), txtAge.getText() }; DefaultTableModel tableModel = (DefaultTableModel) getJTable().getModel(); tableModel.addRow(rowData); txtName.setText(""); txtAge.setText(""); } }); } return btnInsert; } // 행 삭제 버튼 생성 public JButton getBtnUpdate() { if(btnUpdate == null) { btnUpdate = new JButton(); btnUpdate.setText("수정"); btnUpdate.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 테이블 모델을 디폴트 테이블모델로 형 변환 DefaultTableModel tableModel = (DefaultTableModel) getJTable().getModel(); Vector<Vector> rows = tableModel.getDataVector(); Vector row = rows.elementAt(jTable.getSelectedRow()); row.set(0, txtName.getText()); row.set(1, txtAge.getText()); tableModel.fireTableDataChanged(); txtName.setText(""); txtAge.setText(""); } }); } return btnUpdate; } // 행 삭제 버튼 생성 public JButton getBtnDelete() { if(btnDelete == null) { btnDelete = new JButton(); btnDelete.setText("삭제"); btnDelete.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 사용자가 몇 번째 행을 선택했는지 확인 int rowIndex = getJTable().getSelectedRow(); if(rowIndex != -1) { // 테이블 모델을 디폴트 테이블모델로 형 변환 DefaultTableModel tableModel = (DefaultTableModel) getJTable().getModel(); tableModel.removeRow(rowIndex); // 텍스트 필더 내요을 초기화(비워두기) txtName.setText(""); txtAge.setText(""); } } }); } return btnDelete; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JTableExample5 jFram = new JTableExample5(); jFram.setVisible(true); } }); } }
JTable을 이용해 테이블을 만들고 입력/출력 처리, 마우스 효과 등을 추가해보았습니다.
다양한 메소드들을 사용하니 출력 화면에 더 많은 효과를 넣을 수 있네요! 더 많은 기능들에 대해서 배워볼게요~!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
728x90
반응형
'BackEnd > Java' 카테고리의 다른 글
[java]이것이 자바다 부록 Java UI 10 (Swing을 이용한 메뉴 컴포넌트) (0) | 2023.02.20 |
---|---|
[java]이것이 자바다 부록 Java UI 9 (Swing을 이용한 트리 컴포넌트) (0) | 2023.02.19 |
[java]이것이 자바다 부록 Java UI 8 (Swing을 이용한 테이블 컴포넌트 1) (0) | 2023.02.18 |
[java]이것이 자바다 부록 Java UI 6-1 (Swing을 이용한 텍스트 컴포넌트 2) (0) | 2023.02.17 |
[java]이것이 자바다 부록 Java UI 6 (Swing을 이용한 텍스트 컴포넌트) (1) | 2023.02.16 |