2010-02-04 3 views
1

데이터베이스 테이블을 JTable로 표시하려고합니다. 전에 JTable과 TableModel을 봤습니다. 그 인터넷 검색으로 Java의 JTable 용 JDBC TableModel?

, 지금

Object[][] data; 

에 저장된 데이터를 보여 내 자신의 사용자 정의하는 TableModel을 쓸 수 있어요, 나는 JTable의로 내 데이터베이스 테이블의 데이터를 표시합니다. 나는 또한 그것을 검색했고 그 아이디어를 얻었지만 AbstractTableModel의 구현 클래스에서 어디로 가야하는지 혼란 스럽습니다.

다음은 사용자 정의 TableModel의 코드입니다. 그가 클릭 할 때

  • 사용자가 직접 테이블을 편집 할 수 있습니다

    1. 그것은 데이터베이스에서 데이터를 보여줍니다 : 내 JTable가이 follwing을 특징을 가질 수 있도록

      public abstract class AbstractPOLDATTableModel extends AbstractTableModel { 
      protected boolean DEBUG = false; 
      private String[] columnNames; 
      private Object[][] data; 
      
      protected AbstractPOLDATTableModel(String[] columnNames, Object[][] data) { 
          this.columnNames = columnNames; 
          this.data = data; 
      } 
      
      public int getColumnCount() { 
          return columnNames.length; 
      } 
      
      public int getRowCount() { 
          return data.length; 
      } 
      
      @Override 
      public String getColumnName(int col) { 
          return columnNames[col]; 
      } 
      
      public Object getValueAt(int row, int col) { 
          return data[row][col]; 
      } 
      
      @Override 
      public Class getColumnClass(int c) { 
          return getValueAt(0, c).getClass(); 
      } 
      
      @Override 
      public boolean isCellEditable(int row, int col) { 
          if (col < 2) { 
           return false; 
          } else { 
           return true; 
          } 
      } 
      
      @Override 
      public void setValueAt(Object value, int row, int col) { 
          if (DEBUG) { 
           System.out.println("Setting value at " + row + "," + col 
                + " to " + value 
                + " (an instance of " 
                + value.getClass() + ")"); 
          } 
      
          data[row][col] = value; 
          fireTableCellUpdated(row, col); 
      
          if (DEBUG) { 
           System.out.println("New value of data:"); 
           printDebugData(); 
          } 
      } 
      
      private void printDebugData() { 
          int numRows = getRowCount(); 
          int numCols = getColumnCount(); 
      
          for (int i=0; i < numRows; i++) { 
           System.out.print(" row " + i + ":"); 
           for (int j=0; j < numCols; j++) { 
            System.out.print(" " + data[i][j]); 
           } 
           System.out.println(); 
          } 
          System.out.println("--------------------------"); 
      } 
      } 
      

      이제 어떻게 위의 코드를 변경하려면 "저장"버튼의 변경 사항은 데이터베이스 데이터에 반영됩니다.

    2. 사용자가 직접 데이터를 삽입 할 수 있습니다.
    3. 사용자가 직접 데이터를 삭제할 수 있습니다.
  • +0

    최근 게시 한 곳에서 작업 예제가 제공됩니다. – camickr

    +0

    어제 같은 질문을했습니다. http://stackoverflow.com/questions/2192764/how-to-fill-data-in-a-jtable-with-database – sateesh

    +0

    Yatendra - 어제의 예를보세요. 질문하고 나에게 갇혀 버린 곳을 말해 주면 몇 가지 조언을 해드 리도록하겠습니다. – Adamski

    답변

    1

    Adamski가 이전 질문에서 제안한 것에 따라 1을 구현했다고 가정합니다. 또한 Sanoj에서 제안한 것처럼 어떤 종류의 List를 사용하여 데이터를 저장하도록 변경하십시오. 2-4를 지원하기 위해

    1. , 당신은 당신이 데이터베이스에서 끌어있는 데이터를 하나의 테이블에서오고 더 파생 된 데이터 (예를 들면. 집계, 컬럼 1 + 2 열)을 포함하지 않도록해야합니다. 사용자가 행을 필터링하도록하려는 경우 where 절을 추적해야합니다.

    2. 각 행 내에 사용자가 GUI를 사용하여 작성한 업데이트를 나타내는 다른 행 (updatedRow라고 함)을 저장하십시오. 행에 대한 업데이트가 이루어지면이 필드는 업데이트 된 데이터가 포함 된 새 행으로 채워 져야합니다. "저장"을 클릭하면 null이 아닌 updatedRow가있는 모든 행에 대해 업데이트 쿼리가 실행되고 원래 행과 일치하지 않는 updatedRow의 데이터로 데이터베이스가 업데이트됩니다 (사용자가 데이터를 다시 원래의 행으로 변경하면 업데이트되지 않음). 그것은 원래). 또 다른 "업데이트 취소"버튼을 사용하여 null이 아닌 updatedRow가있는 모든 행의 원래 데이터로 테이블을 채울 수도 있습니다.

      필드가 기본 키를 형성하는 추가 메타 데이터를 저장하고 이러한 키의 업데이트가 비용이 많이 들기 때문에 변경하지 못하도록하는 것이 좋습니다 (인덱싱되고 일부 RI 제약 조건이 첨부 될 수 있음). 이 열을 편집 할 수 없도록함으로써 GUI에 반영되어야합니다. 업데이트의 where 절은 모든 필드가 아닌이 필드 만 사용합니다 (사용자가 1로 설정 한 다른 필터가 여전히 필요합니다).

    3. 두 단계 프로세스를 제안합니다. 사용자는 테이블에 행을 추가하는 버튼을 클릭하여 시작합니다. 데이터를 입력 한 후 사용자는 다른 버튼을 클릭하여 데이터베이스에 삽입합니다 (또는이 기능을 "저장"버튼의 업데이트와 결합 할 수 있음). 기본 키 열이 자동 생성 ID가 아닌 경우 새로 삽입 된 행에 대해 기본 키 필드를 편집 할 수 있어야합니다.

      행이 이미 데이터베이스에 있고 어느 행이 다른지에 대해 새로 삽입 된 행의 목록을 저장하는 것이 좋습니다.

      사용자가 테이블에 표시 할 특정 열만 선택하게하려면 표시되지 않는 열을 처리하는 방법을 결정해야합니다 (예 : 데이터베이스를 기본값으로 설정하고 자동 생성으로 채 웁니다 신분증).

    4. 아마도 각 행의 확인란을 사용하여 구현하는 것이 가장 좋을 것입니다. "삭제"버튼을 클릭하면 1에서부터의 필터와 2에서 언급 한 기본 키 메타 데이터를 사용하여 확인 된 각 행을 삭제하기 위해 SQL을 호출합니다. 테이블에서 그것을 제거하는 것이 좋습니다.

    일반적인 고려 사항 :

    • 동일한의 setValueAt 방법

      모두 업데이트 및 삽입 행에 사용됩니다,하지만 당신은 다른 동작을합니다. 업데이트를 위해 updatedRow를 설정하려고하지만, 삽입하려는 행을 편집 할 때가 아닙니다.

    • 제약 조건이 맞지 않거나 잘못된 입력 (예 : 숫자 필드에서 'abcde')과 같은 오류를 어떻게 처리합니까?

    • SQL 주입.