⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 databasetablemodel.java

📁 基于java swing的联机考试系统
💻 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 + -