?? databasetablemodel.java
字號:
package olts.presentation;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
/**
* 數(shù)據(jù)庫各面板管理器中使用的JTable表格的數(shù)據(jù)模型
*/
public class DatabaseTableModel extends AbstractTableModel {
protected DatabaseTableColumn[] columns; // 表列信息
protected ArrayList data;
protected int keyCol; // 關(guān)鍵字段所在的列
// 指明使用該模型的表格是否可修改表格單元,注意關(guān)鍵字段所在的列總是不可修改的
protected boolean modifiable;
public DatabaseTableModel(ArrayList data, DatabaseTableColumn[] columns,
String keyField, boolean modifiable) {
this.data = data;
this.columns = columns;
keyCol = 0;
int i;
for (i = 0; i < columns.length; i++) {
if (keyField.equals(columns[i].getField())) { keyCol = i; break; }
}
// 打印信息供調(diào)試用,沒有拋出異常!
if (i >= columns.length) System.out.println("傳入了錯誤的關(guān)鍵字段參數(shù):" + keyField);
// 表格單元是否可以修改,取決于創(chuàng)建數(shù)據(jù)模型時此屬性對應(yīng)的實際參數(shù)值
this.modifiable = modifiable;
}
/**
* 返回表列數(shù)
*/
public int getColumnCount() { return columns.length; }
/**
* 返回表列名稱
* @param col 列數(shù)
*/
public String getColumnName(int col) { return columns[col].getName(); }
/**
* 返回表行數(shù)
*/
public int getRowCount() { return data.size(); }
/**
* 返回表格第col列的首選寬度
* @param col 表格列
* @return 第col列的首選寬度
*/
public int getColumnWidth(int col) { return columns[col].getWidth(); }
/**
* 返回表格第col列所對應(yīng)的數(shù)據(jù)字段名稱
* @param col 表格列
* @return 表格第col列所對應(yīng)的數(shù)據(jù)字段名稱
*/
public String getFieldName(int col) { return columns[col].getField(); }
/**
* 返回關(guān)鍵字段名稱
* @return 關(guān)鍵字段名稱
*/
public String getKeyFieldName() { return columns[keyCol].getField(); }
/**
* 返回關(guān)鍵字段在表格中的列下標(biāo),即列序號
* @return 關(guān)鍵字段在表格中的列下標(biāo),即列序號
*/
public int getKeyFieldColumn() { return keyCol; }
/**
* 利用關(guān)鍵字段值找其所在記錄的行下標(biāo)
* @param keyId 關(guān)鍵字段值
* @return 關(guān)鍵字段值所在記錄的行下標(biāo)
*/
public int getKeyIdRow(Object keyId) {
// 逐行搜索
for (int i = 0; i < data.size(); i++) {
Object[] rowData = (Object[])data.get(i);
if (rowData[keyCol].equals(keyId)) return i;
}
return -1;
}
/**
* 獲得每列數(shù)據(jù)所屬的類型的名稱
* @param col 表格列
*/
public Class getColumnClass(int col) { return columns[col].getType(); }
/**
* 返回列的表格單元是否可修改
* @param row 表格行
* @param col 表格列
*/
public boolean isCellEditable(int row, int col) {
// 屏幕上顯示的表格列可由用戶拖動,但用戶拖動列不會改變內(nèi)部數(shù)據(jù)模型的列的順序
if (col == keyCol) return false; // 關(guān)鍵字段所在的列不可編輯
else return modifiable; // 非關(guān)鍵字段由創(chuàng)建時的制定決定
}
/**
* 返回某個表格單元的數(shù)據(jù)
* @param row 表格行
* @param col 表格列
*/
public Object getValueAt(int row, int col) {
Object[] rowData = (Object[])data.get(row);
return rowData[col];
}
/**
* 設(shè)置某個表格單元的數(shù)據(jù)
* @param row 表格行
* @param col 表格列
*/
public void setValueAt(Object value, int row, int col) {
Object[] rowData = (Object[])data.get(row);
rowData[col] = value; // 執(zhí)行更改
data.set(row, rowData); // 用指定的元素替代此列表中指定位置上的元素。列表data中一個元素被value替換
fireTableCellUpdated(row, col); // 繼承的方法。通知所有偵聽器,已更新 [row, col] 處的單元格值。
}
/**
* 刪除由關(guān)鍵字段值keyId所指定的一行
* @param keyId 關(guān)鍵字段值
*/
public void removeRow(Object keyId) {
// 有關(guān)鍵字段值找到其所在行
int currentRow = getKeyIdRow(keyId);
// 刪除data中的指定行
data.remove(currentRow);
// 通知所有偵聽器,已刪除范圍在 [firstRow, lastRow](包括)的行
fireTableRowsDeleted(currentRow, currentRow);
}
/**
* 增加一行數(shù)據(jù)
* @param rowData 需添加的記錄
*/
public void addRow(Object[] rowData) {
data.add(rowData);
// 通知所有偵聽器,已插入范圍在 [firstRow, lastRow](包括)的行
fireTableRowsInserted(data.size(), data.size());
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -