📄 databasetablemodel.java
字号:
package olts.presentation;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
/**
* 数据库各面板管理器中使用的JTable表格的数据模型
*/
public class DatabaseTableModel extends AbstractTableModel {
protected DatabaseTableColumn[] columns; // 表列信息
protected ArrayList data;
protected int keyCol; // 关键字段所在的列
// 指明使用该模型的表格是否可修改表格单元,注意关键字段所在的列总是不可修改的
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; }
}
// 打印信息供调试用,没有抛出异常!
if (i >= columns.length) System.out.println("传入了错误的关键字段参数:" + keyField);
// 表格单元是否可以修改,取决于创建数据模型时此属性对应的实际参数值
this.modifiable = modifiable;
}
/**
* 返回表列数
*/
public int getColumnCount() { return columns.length; }
/**
* 返回表列名称
* @param col 列数
*/
public String getColumnName(int col) { return columns[col].getName(); }
/**
* 返回表行数
*/
public int getRowCount() { return data.size(); }
/**
* 返回表格第col列的首选宽度
* @param col 表格列
* @return 第col列的首选宽度
*/
public int getColumnWidth(int col) { return columns[col].getWidth(); }
/**
* 返回表格第col列所对应的数据字段名称
* @param col 表格列
* @return 表格第col列所对应的数据字段名称
*/
public String getFieldName(int col) { return columns[col].getField(); }
/**
* 返回关键字段名称
* @return 关键字段名称
*/
public String getKeyFieldName() { return columns[keyCol].getField(); }
/**
* 返回关键字段在表格中的列下标,即列序号
* @return 关键字段在表格中的列下标,即列序号
*/
public int getKeyFieldColumn() { return keyCol; }
/**
* 利用关键字段值找其所在记录的行下标
* @param keyId 关键字段值
* @return 关键字段值所在记录的行下标
*/
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;
}
/**
* 获得每列数据所属的类型的名称
* @param col 表格列
*/
public Class getColumnClass(int col) { return columns[col].getType(); }
/**
* 返回列的表格单元是否可修改
* @param row 表格行
* @param col 表格列
*/
public boolean isCellEditable(int row, int col) {
// 屏幕上显示的表格列可由用户拖动,但用户拖动列不会改变内部数据模型的列的顺序
if (col == keyCol) return false; // 关键字段所在的列不可编辑
else return modifiable; // 非关键字段由创建时的制定决定
}
/**
* 返回某个表格单元的数据
* @param row 表格行
* @param col 表格列
*/
public Object getValueAt(int row, int col) {
Object[] rowData = (Object[])data.get(row);
return rowData[col];
}
/**
* 设置某个表格单元的数据
* @param row 表格行
* @param col 表格列
*/
public void setValueAt(Object value, int row, int col) {
Object[] rowData = (Object[])data.get(row);
rowData[col] = value; // 执行更改
data.set(row, rowData); // 用指定的元素替代此列表中指定位置上的元素。列表data中一个元素被value替换
fireTableCellUpdated(row, col); // 继承的方法。通知所有侦听器,已更新 [row, col] 处的单元格值。
}
/**
* 删除由关键字段值keyId所指定的一行
* @param keyId 关键字段值
*/
public void removeRow(Object keyId) {
// 有关键字段值找到其所在行
int currentRow = getKeyIdRow(keyId);
// 删除data中的指定行
data.remove(currentRow);
// 通知所有侦听器,已删除范围在 [firstRow, lastRow](包括)的行
fireTableRowsDeleted(currentRow, currentRow);
}
/**
* 增加一行数据
* @param rowData 需添加的记录
*/
public void addRow(Object[] rowData) {
data.add(rowData);
// 通知所有侦听器,已插入范围在 [firstRow, lastRow](包括)的行
fireTableRowsInserted(data.size(), data.size());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -