▶ JTable
- 데이터를 테이블 형식으로 표현하고, 사용자가 값을 편집할 수 있게 하는 컴포넌트이다.
- 단, 데이터를 저장하지 않고, 단순히 보여주는 용도로 사용된다.
생성자 |
|
JTable() |
기본 테이블 모델을 가진 빈 테이블을 생성한다 |
JTable(int numRows, int numColumns) |
지정된 행과 열의 수를 가진 테이블을 생성한다. |
JTable(Object[][] rowData, Object[] columnName) |
첫 번째 매개변수는 테이블에 들어갈 데이터이므로 오브젝트 타입의 2차원 배열을 받는다. 두 번째 매개변수는 테이블의 첫 번째 행에 들어가 데이터를 구분 짓는 열의 이름이 들어간다. |
JTable(TableModel dm) |
새 테이블 모델을 가진 테이블을 생성한다. |
JTable(TableModel dm, TableColumnModel cm) |
새 테이블 모델과 테이블 컬럼 모델을 가진 테이블을 생성한다. |
JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) |
테이블의 모든 모델들을 새로 지정받은 테이블을 생성한다. |
- 메소드는 너무 많은 자료를 가지고 있어서 아래에 링크를 남깁니다.
https://docs.oracle.com/javase/7/docs/api/javax/swing/JTable.html
- 테이블 생성하기 예시
private String[] columnType = { "번호", "이름", "나이", "성별"};
private Object[][] data = {
{"1", "김철수", "20", "남성"},
{"2", "김옥자", "43", "여성"},
{"3", "이순신", "100", "남성"},
{"4", "유관순", "18", "여성"},
{"5", "이 도", "54", "남성"}
};
JTable table = new JTable(data, columnType);
- 이전에도 설명했듯이 ScrollPane은 동적으로 변할 수 있는 컴포넌트와 함께 쓰인다. 주로 JTree, JTable처럼 데이터를 보여주되 사용자의 동작에 따라 컴포넌트의 크기가 변할 수 있는 컴포넌트가 있다. 쉽게 말해 트리나 테이블에는 스크롤바가 붙어야 실용성이 있다는 의미이다.
JScrollPane scrollPane = new JScrollPane(table); //스크롤 페인이 테이블의 컨테이너가 된다.
table.setFillsViewportHeight(true); //컨테이너의 전체 높이를 테이블이 전부 사용하도록 설정한다.
- 테이블은 각 셀의 데이터가 변경되면 다른 컴포넌트와 달리 TableModelListener 인터페이스를 구현하여 이벤트를 처리한다. 또한 JTable 객체는 하나의 테이블 모델(model)을 가진다. 따라서 리스너를 추가하는 메소드는 테이블을 관리하는 모델로부터 호출되어야 한다. 아래의 예시에서는 한 번에 보여주기 위해 익명 객체를 사용하였다. 리스너를 구현하는 방법은 본인이 선택하면 될 것이다.
table.getModel().addTableModelListener(new TableModelListener {
@Override
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow(); //첫 번째 행을 얻는다.
int column = e.getColumn(); //변경된 셀의 컬럼 인덱스를 얻는다.
TableModel model = (TableModel) e.getSource();
String columnName = model.getColumnName(column); //해당 인덱스를 가진 열의 이름을 얻는다.
Object data = model.getValueAt(row, column);
//데이터를 처리하는 구간
...
}
});
- 테이블은 정렬과 필터링을 할 수 있는데, 이들 모두 정렬기 객체를 이용하여 수행할 수 있다. 가장 쉬운 방법은 테이블의 autoCreateRowSorter 특성을 true로 설정하는 것이다. 이 속성을 true로 설정하면, 컬럼 헤더를 클릭했을 때 행을 자동으로 정렬해주는 정렬기를 정의한다.
table.setAutoCreateRowSorter(true);
- 테이블은 사용자가 셀의 값을 변경할 수 있는데, 개발자에 의해 정해진 셀의 값을 가질 수도 있다. 또는 정해진 선택지 속에서 사용자가 셀의 값을 변경할 수 있다. 자주 사용되는 것은 콤보 박스이다.
[좌측 아래 콤보 박스에 프로그래밍 언어가 나열되있는 것을 볼 수 있다.]
- 콤보박스를 이용하여 셀 에디터 만들기
TableColumn gender = table.getColumnModel().getColumn(2); //인덱스가 2인 컬럼얻기
...
JComboBox genderCells = new JComboBox();
comboBox.addItem(“남성”);
comboBox.addItem(“여성”);
gender.setCellEditor(new DefaultCellEditor(genderCells);
- 자바에서는 테이블을 출력할 수 있는 기능을 API로 제공한다.
...
table.print(); //해당 메소드를 호출할 때는 JMenuBar를 구현하여 메뉴 선택 시 호출하도록 하는 것이 일반적이다.
...
try {
if (!table.print()) {
//사용자가 인쇄를 취소하였을 때의 동작 정의
}
} catch(java.awt.print.PrinterException e) {
System.err.format(“인쇄 도중 오류 발생 : %s%n”, e.getMessage());
}
- 테이블 예제
import javax.swing.*; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import java.awt.*; /** * Created by with2J on 2017-07-21. */ public class JTableTest extends JFrame implements TableModelListener { public static void main(String[] args) { new JTableTest(); } //FIELDS private JTable table; private JScrollPane scrollPane; private String[] columnType = { "번호", "이름", "나이", "성별"}; private Object[][] data = { {"1", "김철수", "20", "남성"}, {"2", "김옥자", "43", "여성"}, {"3", "이순신", "100", "남성"}, {"4", "유관순", "18", "여성"}, {"5", "이 도", "54", "남성"} }; //CONSTRUCTOR JTableTest() { super("JTable Test!"); //setTitle() 도 가능 setSize(500, 300); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); table = new JTable(data, columnType); scrollPane = new JScrollPane(table); table.setPreferredScrollableViewportSize(new Dimension(500, 300)); table.setFillsViewportHeight(true); table.getModel().addTableModelListener(this); // 테이블에 소속된 하나의 모델이 셀들을 관리하므로 항상 getModel() 을 호출해야함 table.setAutoCreateRowSorter(true); //자동 행 정렬기능 //성별 컬럼에 지정된 선택지만 추가할 수 있도록 설정한다. TableColumn genderColumn = table.getColumn("성별"); JComboBox gender = new JComboBox(); gender.addItem("여성"); gender.addItem("남성"); genderColumn.setCellEditor(new DefaultCellEditor(gender)); add(scrollPane); setVisible(true); } @Override public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); if (column == 2) { // 컬럼번호가 2이면 "나이" 컬럼이다. 컬럼인덱스는 0부터 시작한다. TableModel model = (TableModel) e.getSource(); String colName = model.getColumnName(column); //해당 인덱스의 컬럼이름을 받아온다. String str = (String) model.getValueAt(row, column); // data는 object 타입이므로 형변환해야 한다. if (Integer.parseInt(str) > 100) { //입력한 나이값이 100이 넘을 경우, 경고창을 띄운다. JOptionPane.showMessageDialog(this, "나이 범위를 초과하였습니다. 100 미만으로 입력해주세요.", "경고", JOptionPane.WARNING_MESSAGE); } } } }
[나이의 범위를 넘어서면 팝업창이 뜨는 것을 볼 수 있다.]
[이름을 클릭하면, 이름순으로 행정렬이 이루어지는 것을 볼 수 있다.]
'Programming Language > JAVA' 카테고리의 다른 글
35. Exception, try-catch-finally - 예외, 예외 처리 (0) | 2017.07.23 |
---|---|
34. Package - 패키지 (0) | 2017.07.23 |
32. JOptionPane, JDialog - 대화 상자 (0) | 2017.07.22 |
31. JMenuBar - 메뉴바 설정하기 (0) | 2017.07.13 |
30. JColorChooser, JFileChooser - 색상 선택기, 파일 선택기 (0) | 2017.06.29 |