IT_Programming/Java

JTable과 DB 연동 예제 (SQL Server 2005 Express Edition)

JJun ™ 2009. 4. 8. 23:17

 

 

JTable에 관련된 클래스

 

1. 테이블의 모델을 형성하는 클래스

테이블의 모양(모델)을 형성하는 클래스류로는 TableModel, AbstractTableModel, DefaultTableModel가 있다. 다음 표는 이들 클래스에 대한 설명이다.

클래스

설명
TableModel 테이블의 데이터에 대한 접근 통로를 제공하는 인터페이스다.
AbstractTableModel TableModel를 구현한 클래스이다. 개발자가 직접 모델을 정위해서 사용하려면 이 클래스를 상속받아 사용한다.
DefaultTableModel AbstractTableModel를 상속하는 클래스로서 AbstractTableModel이 구현하지 않은 나머지 메서드들도 모두 구현되어 있다.

 

2. 테이블의 열(column)을 관리하는 클래스

테이블의 열 혹은 열들을 관리하는데 관여하는 클래스는 TableColumn, TableColumnModel, DefaultTableColumnModel이다. 열 관리는 새로운 열추가, 기존의 열 제거, 다른위치로 열 이동, 열 선택 등이 있다.

클래스

설명
TableColumn 하나의 열을 나타낸다.
TableColumnModel 여러 열들을 통합 관리하기위한 인터페이스
DefaultTableColumnModel JTable을 위해 JTableColumnModel의 기본 구현을 제공한다.

 

3. 테이블의 셀을 관리하는 클래스

테이블의 셀을 관리하는 클래스는 TableCellRenderer, TableCellEditor이다. 칼럼에는 같은 종류의 형태로

이루어진 것이 많으므로 하나의 칼럼당 하나의 TableCellRenderer와 TableCellEditor를 제공한다.

클래스

설명
TableCellRenderer 셀의 내용을 화면에 나타내는 인터페이스
TableCellEditor 셀을 편집하는 인터페이스


 

====================================================================================================

 /*

  * 작성자: 블로그 주인장 (creazier)

  * 작성일자: 2009.04.08

  * 작성계기: 누가 물어봐서...쉽게 간단하게 만들어 본 예제

  */

 

package src;

 

import! javax.swing.table.*;
import! javax.swing.*;
import! java.sql.*;

 

class Test extends JFrame
{
      private JTable jTable;
      private Connection conn;
      private PreparedStatement pstmt;
      private ResultSet rs;
      private ResultSetMetaData rsmd;
      private Object[] col;
      private Object[][] data;
 
      /* SQL server 2005 Express Edition */
      final static String connStr =

              "jdbc:sqlserver://localhost:1079;databaseName=Test;user=********;password=***********;";
      final static String _driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; 
  
      public Test()
      {  
            initialize();
      }
 
      private void initialize()
      {
            try
            {
                  Class.forName(_driver);
                  conn = DriverManager.getConnection(connStr);
   
                  String sql = "select * from student";
                  pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

                  // ↑  getResultSetSize 함수에서 last()함수를 사용하기 위해서 설정 

                 // 사실 여기서는 쿼리문으로 사이즈를 알아오는 것이 훨씬 효율적이다.              


                  rs = pstmt.executeQuery();
                  rsmd = rs.getMetaData();
   
                  col = new Object[rsmd.getColumnCount()];
                  for(int i=1; i<=rsmd.getColumnCount(); i++)
                  {
                        col[i-1] = rsmd.getColumnName(i);
                  }
   
                  int initNum = getResultSetSize(rs);
                  data = new Object[initNum][];
                  int index = 0;
                  while(rs.next())
                  {    
                        data[index++] = new Object[]{rs.getInt(1), rs.getString(2), rs.getString(3)};
                  }
            }
            catch(SQLException sqlExecption)
            {
                  sqlExecption.printStackTrace();
            } 
            catch (ClassNotFoundException e) 
            {
                  e.printStackTrace();
            }
            finally 
            {
                  try { rs.close(); conn.close();}
                  catch(Exception e1){e1.printStackTrace();}
            }
   
            DefaultTableModel tableModel = new DefaultTableModel(data, col);

            DefaultTableCellRenderer tableRender = new DefaultTableCellRenderer();

            tableRender.setHorizontalAlignment(JLabel.CENTER);


            jTable = new JTable(tableModel);

            for(int i=0; i<jTable.getColumnCount(); i++)
            {
                  jTable.getColumnModel().getColumn(i).setCellRenderer(tableRender); // 가운데 정렬
            }


            JScrollPane jsp = new JScrollPane(jTable);

            // JTable은 JScrollPane에 넣어서 보여주어야 합니다.

 

            this.add(jsp);
            this.setTitle("JFrame");
            this.setSize(413, 235);
            this.setVisible(true);
      }

 

      private int getResultSetSize(ResultSet resultSet) throws SQLException // ResultSet row 수 반환
      {
            int size = -1;
            resultSet.last(); 
            size = resultSet.getRow();
            resultSet.beforeFirst();
 
            return size;
      }

 

      public static void main(String[] args)
      {
            new Test();
      }
}



==================================================================================================

 

[참고]

 

// 내용 수정 불가 
mod = new DefaultTableModel(data,title) {
    public boolean isCellEditable(int rowIndex, int mColIndex) {
        return false;
   }
};

 

// 이동, 크기 조절 불가
table1 = new JTable(mod1);
table1.getTableHeader().setReorderingAllowed(false); // 이동 불가
table1.getTableHeader().setResizingAllowed(false); // 크기 조절 불가
}


◆ Auto Resize Mode 상수정의

  

    - AUTO_RESIZE_OFF

       : 자동 크기 조절 하지 않음.

       : 테이블의 크기에 따라서 수평, 수직 스크롤바가 나타남.

 

    - AUTO_RESIZE_ALL_COLUMNS

       : 한 열의 폭이 변경되면 비례적으로 테이블 내의 다른 모든 열에서 흡수.

 

    - AUTO_RESIZE_LAST_COLUMN

       : 한 열의 폭이 변경되면 마지막 열의 폭에 변경된 양이 적용됨.

 

    - AUTO_RESIZE_NEXT_COLUMN

       : 한 열의 폭이 변경되면 바로 다음의 열에 영향을 줌.

 

    - AUTO_RESIZE_SUBSEQUENT_COLUMNS

       : 한 열의 폭이 변경되면 오른쪽의 다른 모든 열들의 폭이 변경됨.


 

'IT_Programming > Java' 카테고리의 다른 글

[펌] 자바로 바탕화면 캡쳐하기   (0) 2009.04.12
[펌] 자바 에러 모음  (0) 2009.04.12
[펌_ jdbc] ResultSet 크기 구하기   (0) 2009.04.08
[펌] Generics 튜토리얼  (0) 2009.03.24
웹 브라우저 실행하기  (0) 2009.02.03