2010-02-04 30 views
1

我想顯示一個數據庫表作爲JTable。我從來沒有使用過JTable,所以我使用JTable和TableModel。用於Java中JTable的JDBC TableModel?

隨着那google搜索,我可以寫我自己的自定義的TableModel這顯示存儲在

Object[][] data; 

現在的數據,我想表明我的數據庫表中的數據到JTable中。我也搜索了這個,並對此有了一個瞭解,但仍然對AbstractTableModel的實現類中應該出現什麼問題感到困惑。

以下是自定義TableModel的代碼。現在

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

,如何更改上面的代碼,使我的JTable中可以有follwing特點:

  1. 它顯示數據庫中的數據
  2. 用戶可以直接編輯表,他點擊時在「保存」按鈕上,更改反映在數據庫數據中
  3. 用戶可以直接插入數據。
  4. 用戶可以直接刪除數據。
+0

你在哪裏給你最後發表的工作示例。 – camickr

+0

昨天你問了幾乎相同的問題:http://stackoverflow.com/questions/2192764/how-to-fill-data-in-a-jtable-with-database – sateesh

+0

Yatendra - 看看我昨天的例子問題並告訴我你卡在哪裏,我會盡力給你一些指示。 – Adamski

回答

1

我假設你已經實施了1根據Adamski在你的上一個問題中提出的建議。另外,正如Sanoj所建議的,更改爲使用某種List來存儲數據。

  1. 爲了支持2-4,你必須確保你拉出數據庫的數據來源只有一個表,不涉及衍生的數據(例如,聚合,列1 +列2)。如果您打算讓用戶過濾行,則需要跟蹤您的where子句。

  2. 在每行中,存儲另一行(我們稱之爲updatedRow),它表示用戶使用GUI進行的更新。一旦對該行進行了任何更新,該字段需要填充包含更新數據的新行。單擊「保存」後,您將對所有具有非空updatedRow的行運行更新查詢,並使用updatedRow中的數據更新數據庫,這些數據與原始行中的數據不匹配(如果用戶將數據更改回原樣,則不更新它原來是)。您可能還有另一個「撤消更新」按鈕,該按鈕使用非空updatedRow爲所有行填充原始數據。

    我強烈建議您存儲額外的元數據在哪些字段形成主鍵,並防止更改這些列,因爲更新此類列可能會很昂貴(因爲它們可能是索引,並可能有一些RI約束附加)。這應該通過使這樣的列不可編輯來反映在GUI中。更新中的where子句將只使用這些字段而不是所有字段(您仍然需要其他用戶在1中設置的過濾器)。

  3. 我建議分兩步進行。用戶通過點擊一個按鈕來添加一行到表格。輸入數據後,用戶單擊另一個按鈕以插入數據庫(或者可以將此功能與「保存」按鈕中的更新組合)。如果主鍵列不是某些自動生成的ID,則需要允許主鍵字段對新插入的行進行編輯。

    爲了區別哪些行已經在數據庫中,哪些不在,我建議存儲新插入的行的列表。

    如果您讓用戶只挑選某些列以在表中顯示,您需要確定如何處理未顯示的列(例如,讓數據庫設置默認值,填充自動生成的ID)。

  4. 可能最好是通過每行都有一個複選框來實現這一點,然後當單擊「刪除」按鈕時,它會調用SQL刪除每個選中的行,使用1中的過濾器和2中提到的主鍵元數據以及將其從桌面上移除。

一般考慮:

  • 同樣的setValueAt方法將同時用於更新和插入的行,但你想不同的行爲。你想爲更新設置updatedRow,但不是在編輯你要插入的行時。

  • 你將如何處理諸如約束未被滿足或輸入無效的錯誤(例如數字字段中的'abcde')?

  • SQL注入。