[英]JDBC TableModel for a JTable in Java?
我想將數據庫表顯示為JTable。 我以前從未使用過JTable,所以我在JTable和TableModel上進行了谷歌搜索。
通過谷歌搜索,我可以編寫自己的自定義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可以具有以下功能:
我假設您已經根據Adamski在上一個問題中提出的建議實施了1。 同樣,如Sanoj所建議,更改為使用某種列表來存儲數據。
要支持2-4,必須確保從數據庫中提取的數據僅來自一個表,並且不包含任何派生數據(例如,聚合,column1 + column2)。 如果要讓用戶篩選行,則需要跟蹤where
子句。
在每一行中,存儲代表用戶使用GUI進行的更新的另一行(我們將其稱為updatedRow)。 一旦對該行進行了任何更新,就需要用包含更新數據的新行填充該字段。 單擊“保存”后,您將使用非null的updatedRow對所有行運行更新查詢,並使用updatedRow中的數據與原始行中的數據不匹配來更新數據庫(如果用戶將數據更改回原來的方式,則不要更新原來是)。 您可能還具有另一個“撤消更新”按鈕,該按鈕將使用具有非null UpdatedRow的所有行的原始數據填充表。
我強烈建議您存儲額外的元數據,在這些元數據上構成主鍵的字段並防止其被更改,因為對此類列的更新可能會很昂貴(因為它們可能已被索引並且可能附加了一些RI約束)。 應該通過使此類列不可編輯來在GUI中反映出來。 更新中的where
子句將僅使用這些字段,而不使用所有字段(您仍然需要用戶在1中設置的其他過濾器)。
我建議分兩個步驟進行。 用戶通過單擊向表添加一行的按鈕開始。 輸入數據后,用戶單擊另一個按鈕以插入數據庫中(或者您可以將此功能與“保存”按鈕中的更新結合在一起)。 如果主鍵列不是某些自動生成的ID,則需要允許新插入的行的主鍵字段可編輯。
為了區分數據庫中已有哪些行和哪些行沒有,我建議存儲一個新插入的行的列表。
如果讓用戶僅選擇要在表中顯示的某些列,則需要確定如何處理未顯示的列(例如,讓數據庫設置默認值,並使用自動生成的ID進行填充)。
最好通過在每個行上都有一個復選框來實現此目的,然后單擊“刪除”按鈕,它將調用SQL以使用1中的過濾器和2中提到的主鍵元數據刪除每個選中的行,然后將其刪除從桌子上。
一般注意事項:
相同的setValueAt方法將用於更新的行和插入的行,但是您需要不同的行為。 您想為更新設置“ updatedRow”,而不是在編輯要插入的行時設置。
您將如何處理錯誤,例如無法滿足約束或輸入無效(例如,數字字段中的“ abcde”)?
SQL注入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.