1. 테이블 컴포넌트
▷ 테이블 형식의 데이터를 표시하고 편집할 수 있는 컴포넌트, 다른 컴포넌트에 비해서 다소 복잡한 구조임
이름 컬럼의 데이터는 모두 텍스트, 나이 컬럼의 데이터는 모두 숫자로 구성
▷ 테이블은 컬럼과 행으로 구성, 컬럼과 행이 만나는 곳이 셀(실제 데이터가 표시되는 곳)
▷ 하나의 컬럼을 구성하는 셀들은 동일한 데이터 타입을 가져야 함
(1) 테이블 생성
▷ 간단한 JTable 객체 만들기 : 컬럼 이름을 포함하고 있는 1차원 String 배열과 셀의 데이터인 2차원 Object 배열을 생성
◎ 테이블 생성 예제
import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; public class JTableExample extends JFrame { private JTable jTable; public JTableExample() { this.setTitle("JTableExample"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.getContentPane().add(new JScrollPane(getJTable()), BorderLayout.CENTER); this.setSize(200, 125); } public JTable getJTable() { if(jTable == null) { String[] columnNames = { "이름", "나이" }; Object[][] rowData = { {"춘삼월", 25}, {"하여름", 23}, {"하바다", 26}, {"추가을", 22}, {"동겨울", 27}, {"동장군", 15} }; jTable = new JTable(rowData, columnNames); jTable.getColumn("이름").setPreferredWidth(100); jTable.getColumn("나이").setPreferredWidth(50); } return jTable; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JTableExample jFram = new JTableExample(); jFram.setVisible(true); } }); } }
(2) 테이블 모델
▷ TableModel 객체를 사용해 컬럼과 셀의 데이터를 관리
▷ 테이블 생성시 컬럼 이름인 1차원 배열, 셀의 데이터인 2차원 배열을 생성자로 넘기면 TableModel이 내부적으로 생성되고 데이터들을 관리함
▷ 내부적으로 생성된 TableModel을 프로그램에서 사용할 수 있도록 getModel() 메소드를 제공
◎ getModel() 메소드
NO | 타입 | 메소드 | 용도 |
1 | int | getColumnCount() | 총 컬럼의 수 얻기 |
2 | String | getColumnName(int columnIndex) | 컬럼의 이름 얻기 |
3 | int | getRowCount() | 총 행의 수 얻기 |
4 | Object | getValueAt(int rowIndex, int columnIndex) | 셀의 데이터 얻기 |
5 | void | setValueAt(Object aValue, int rowIndex, int columnIndex) | 셀의 데이터 변경 |
6 | void | setDataVector(Object[][] rows, Object[] columnNames) setDataVector(Vector rows, Vector columnNames); |
전체 테이블 데이터를 주어진 매개값으로 대체 |
◎ 테이블 모델 생성 및 출력 예제
import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.TableModel; public class JTableExample2 extends JFrame { private JTable jTable; private JButton btnInfo; public JTableExample2() { this.setTitle("JTableExample2"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.getContentPane().add(new JScrollPane(getJTable()), BorderLayout.CENTER); this.getContentPane().add(getBtnInfo(), BorderLayout.SOUTH); this.setSize(200, 200); } public JTable getJTable() { if(jTable == null) { String[] columnNames = { "이름", "나이" }; Object[][] rowData = { {"춘삼월", 25}, {"하여름", 23}, }; jTable = new JTable(rowData, columnNames); } return jTable; } public JButton getBtnInfo() { if(btnInfo == null) { btnInfo = new JButton(); btnInfo.setText("테이블 정보 출력"); btnInfo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 테이블 모델 객체 생성 TableModel tableModel = getJTable().getModel(); // 전체 컬럼 수 int columnCount = tableModel.getColumnCount(); // 전체 행 수 int rowCount = tableModel.getRowCount(); // 컬럼 이름 출력 for(int i=0; i<columnCount; i++) { String columnName = tableModel.getColumnName(i); System.out.print(columnName + "\t\t"); } System.out.println(); System.out.println("-------------------------"); // 행의 데이터 출력 for(int i=0; i<rowCount; i++) { String column0 = (String) tableModel.getValueAt(i, 0); Integer column1 = (Integer) tableModel.getValueAt(i, 1); System.out.println(column0 + "\t\t" + column1); } // 1행 셀 데이터 변경 tableModel.setValueAt("개나리", 0, 0); tableModel.setValueAt(20, 0, 1); } }); } return btnInfo; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JTableExample2 jFram = new JTableExample2(); jFram.setVisible(true); } }); } }
(3) 셀 표현 변경
▷ 컬럼 헤더와 셀 텍스트 내용을 수평 정렬하거나 셀 내용으로 다양한 컴포넌트를 넣을 때 새로운 셀 렌더러를 정의
▷ 셀 렌더러는 넣고 싶은 컴포넌트를 상속하고 TableCellRenderer 인터페이스를 구현해서 만듬
▷ getTableCellRendererComponent() 메소드는 상속받은 컴포넌트를 매개값으로 초기화하고 리턴
◎ getTableCellRendererComponent() 메소드 매개변수
NO | 매개변수 | 값 또는 참조 |
1 | table | 셀을 포함하고 있는 JTable |
2 | value | 셀에 표시될 데이터 |
3 | isSelected | 셀을 포함하고 있는 행이 선택 되었는지 여부 |
4 | hasFocus | 셀에 포커스가 있는지 여부 |
5 | row | 셀을 포함하고 있는 행의 순번 |
6 | column | 셀을 포함하고 있는 컬럼의 순번 |
◎ 셀 표현 변경 예제(마우스로 행을 선택하면 노란색 배경으로 변경)
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Font; import javax.swing.ImageIcon; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class JTableExample3 extends JFrame { private JTable jTable; public JTableExample3() { this.setTitle("JTableExample3"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.getContentPane().add(new JScrollPane(getJTable()), BorderLayout.CENTER); this.setSize(200, 125); } // JTable 생성 public JTable getJTable() { if(jTable == null) { String[] columnNames = { "이름", "나이", "선택" }; Object[][] rowData = { {"춘삼월", 25, false}, {"하여름", 26, true}, {"추가을", 22, false}, {"동겨울", 27, true} }; jTable = new JTable(rowData, columnNames); // 각 컬럼의 셀 렌더러 변경 TableColumn tcName = jTable.getColumn("이름"); tcName.setCellRenderer(new NameTableCellRenderer()); TableColumn tcAge = jTable.getColumn("나이"); tcAge.setCellRenderer(new AgeTableCellRenderer()); TableColumn tcSelect = jTable.getColumn("선택"); tcSelect.setCellRenderer(new SelectTableCellRenderer()); } return jTable; } // 이름 컬럼의 셀 렌더러 정의 public class NameTableCellRenderer extends JLabel implements TableCellRenderer{ public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setText(value.toString()); setFont(new Font(null, Font.PLAIN, 12)); setHorizontalAlignment(JLabel.CENTER); setOpaque(true); // JLabel의 배경을 불투명하게 설정 if(isSelected) { setBackground(Color.yellow); } else { setBackground(Color.white); } return this; } } // 나이 컬럼의 셀 렌더러 정의 public class AgeTableCellRenderer extends JLabel implements TableCellRenderer{ public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { int age = ((Integer) value).intValue(); if(age <= 25) { setIcon(new ImageIcon(getClass().getResource("key.gif"))); } else { setIcon(new ImageIcon(getClass().getResource("start.gif"))); } setText(value.toString()); setFont(new Font(null, Font.PLAIN, 12)); setHorizontalAlignment(JLabel.CENTER); setOpaque(true); // JLabel의 배경을 불투명하게 설정 if(isSelected) { setBackground(Color.yellow); } else { setBackground(Color.white); } return this; } } // 이름 컬럼의 셀 렌더러 정의 public class SelectTableCellRenderer extends JCheckBox implements TableCellRenderer{ public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Boolean boolWrapper = (Boolean) value; setSelected(boolWrapper.booleanValue()); setHorizontalAlignment(CENTER); if(isSelected) { setBackground(Color.yellow); } else { setBackground(Color.white); } return this; } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JTableExample3 jFram = new JTableExample3(); jFram.setVisible(true); } }); } }
JTable을 이용해 테이블 모양을 만들어보았습니다!
Swing으로 정말 간편하게 테이블을 표현할 수 있네요! 더 많은 기능들에 대해서 배워볼게요~!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Java' 카테고리의 다른 글
[java]이것이 자바다 부록 Java UI 9 (Swing을 이용한 트리 컴포넌트) (0) | 2023.02.19 |
---|---|
[java]이것이 자바다 부록 Java UI 8-1 (Swing을 이용한 테이블 컴포넌트 2) (0) | 2023.02.18 |
[java]이것이 자바다 부록 Java UI 6-1 (Swing을 이용한 텍스트 컴포넌트 2) (0) | 2023.02.17 |
[java]이것이 자바다 부록 Java UI 6 (Swing을 이용한 텍스트 컴포넌트) (1) | 2023.02.16 |
[java]이것이 자바다 부록 Java UI 5 (Swing을 이용한 버튼 컴포넌트) (0) | 2023.02.16 |