JTable은 주로 데이터베이스의 데이터를 나타내는데 사용되는 Swing control 이다.
JTable의 사용방법을 알기 위해서는 MVC의 개념을 이해해야 하는데 M : Model, V : View, C : Control 의 약자인 MVC 모델은 간단하게 설명하면 프로그램을 데이터 부분과 화면에 나타나는 GUI부분, 이를 제어하느 Control 부분으로 나누어 처리한다는 개념이다.
JTable에 데이터를 보여주기 위해서는 MVC 중 Model에 해당하는 부분을 정의해주면 된다.
AbstractTableModel
JTable의 모델은 기본적으로 AbstractTableModel을 이용한다.
AbstractTableModel의 주요 Method를 살펴보면 다음과 같다.
int getColumnCount()
JTable의 컬럼의 갯수를 결정하는 Method |
String getColumnName(int columnIndex)
JTable의 컬럼명을 결정하는 Method |
int getRowCount()
JTable의 Row의 갯수를 결정하는 Method |
Object getValueAt(int rowIndex, int columnIndex)
JTable의 각 cell의 데이터를 결정하는 Method |
boolean isCellEditable(int rowIndex, int columnIndex)
JTable의 cell의 입력모드를 설정하는 Method return true - 입력가능 return false - read only |
void setValueAt(Object aValue, int rowIndex, int columnIndex)
JTable의 데이터를 변경해주는 Method |
void fireTableDataChanged()
JTable의 데이터가 변경되었음을 리스너에게 보낸다. |
프로그래머가 원하는 JTable에서의 데이터 처리를 위해서는 AbstractTableModel을 상속받은 클래스를 만든 후 해당 Method를 재 구현해주면 된다. Method 중 getRowCount(), getColumnCount(), getValueAt() 은 반드시 재 구현을 해야 한다.
DBExplorer에서는 Vector를 이용하여 DB 테이블의 데이터를 저장한다. 자바에서는 Vector에 저장된 데이터를 JTable에 보여주는 Model을 제공한다. DefaultTableModel이 그것이다.
일단 AbstractTableModel을 상속받아 이용하는 방법을 먼저보고, 다음에 DefaultTableModel을 이용하는 방법을 구현해보자.
AbstractTableModel 이용
Sample File : TestTable.java
1, AbstractTableModel을 상속받은 클래스를 만든다. class MyTableModel extends AbstractTableModel { }
2. 테이블에 나타날 데이터를 멤버변수로 선언한다. 이때의 Vector는 2차원 Vector를 나타낸다 즉, 벡터의 각 Element는 JTable에서 1개의 Row를 나타내는 Vector이다.
class MyTableModel extends AbstractTableModel { Vector data = new Vector(); }
3. 컬럼명을 나타내는 멤버변수를 선언한다. class MyTableModel extends AbstractTableModel { Vector data = new Vector(); Vector colName = new Vector(); }
3. 필요한 Method를 재정의 한다. class MyTableModel extends AbstractTableModel { Vector data = new Vector(); Vector colName = new Vector();
public int getColumnCount() { return colName.size(); }
public int getRowCount() { return data.size(); }
public Object getValueAt(int row, int col) { Vector rowData = (Vector)data.elementAt(row); Object returnValue = rowData.elementAt(col); return returnValue; }
public String getColumnName(int col) { String name = (String)colName.elementAt(col); return name; } }
4. data 멤버 변수에 값을 설정하는 Method를 정의한다. DB의 데이터를 보여주는 경우 이부분에서 Query를 살행하여 ResultSet으로부터 데이터를 받은 후 멤버변수인 data에 넣으면 된다. 여기서는 간단하게 for loop를 이용하여 구구단을 넣기로 한다.
class MyTableModel extends AbstractTableModel { Vector data = new Vector(); Vector colName = new Vector();
public int getColumnCount() { return colName.size(); }
public int getRowCount() { return data.size(); }
public Object getValueAt(int row, int col) { Vector rowData = (Vector)data.elementAt(row); Object returnValue = rowData.elementAt(col); return returnValue; }
public String getColumnName(int col) { String name = (String)colName.elementAt(col); return name; }
public void setData() { for(int i= 1 ; i<= 9 ; i++) { Vector row = new Vector(); for(int j = 1; j <= 9 ; j++) { int num = j*i; row.addElement(j + "*" + i + " = " + num); } data.addElement(row); colName.addElement(i + "단"); } } }
5. 윈도우 및 JTable을 만드는 메인 클래스를 만든다.
public class TestTable { public TestTable() { JFrame frame = new JFrame("JTable 구구단");
MyTableModel tableModel = new MyTableModel(); tableModel.setData();
JTable table = new JTable(tableModel);
JPanel panel = new JPanel(); JScrollPane p = new JScrollPane(table);
frame.getContentPane().add(p); frame.pack(); frame.setVisible(true); }
public void static main(String agrs[]) { new TestTable(); } }
|