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);
            }
        }
    }
}



[나이의 범위를 넘어서면 팝업창이 뜨는 것을 볼 수 있다.]



[이름을 클릭하면, 이름순으로 행정렬이 이루어지는 것을 볼 수 있다.]




+ Recent posts