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

📄 databasemanager.java

📁 一个JDBC应用的例子
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.util.ArrayList;

// 实现数据库管理器的基础类,具体的数据库的管理可在此类基础上扩展
class DatabaseManager {
	// 属性描述
	protected JPanel managerPane = null;		// 存放管理器界面的面板
	protected JScrollPane tablePane = null;	// 存放管理器的表格的滚动面板
	protected JTable table = null;			// 管理器中的表格
	protected JPanel controlPane = null;		// 存放管理器操作按钮的面板
	protected Container ground;
	protected DatabaseTableModel model;

	// 创建用于管理数据库的面板
	// 参数:Container ground - 创建的面板可以放置的容器
	//		DatabaseTableModel model - 用于创建面板中表格的数据模型
	//		boolean modifiable - 是否可使用管理器修改数据库中的数据
	public void createManagerPane(Container ground, DatabaseTableModel model) {
		this.ground = ground;  
		this.model = model;
		model.addTableModelListener(new DatabaseTableModelListener());
		table = new JTable(model);
		// 设置表格的行选择模式为只能选中一行
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		// 表格初始选中第一行
		table.setRowSelectionInterval(1, 1);
		// 将表格放置在一滚动窗格中
		tablePane = new JScrollPane(table);
		// 创建一面板用于放置操作数据的按钮
		controlPane = new JPanel();
		// 创建一面板使用边界布局管理器放置控制面板和表格滚动面板
		managerPane = new JPanel();
		managerPane.setLayout(new BorderLayout());
		managerPane.add(controlPane, BorderLayout.NORTH);
		managerPane.add(tablePane, BorderLayout.CENTER);
		// 将管理器面板加入到所要放置的容器ground
		ground.add(managerPane);
	}
	// 如果该管理器是可修改数据库中的数据的,则回调下述方法对数据库进行真正的修改
	// 参数:Object keyId - 要修改的数据记录的关键字段值
	//		String modifyField - 要修改的数据域的名称
	//		Object newValue - 数据域的新的值
	// 注意,缺省的数据管理器没有实现该方法
	public void updateFieldValue(Object keyId, String modifyField, Object newValue) {
	}
	// 在表格中增加一行,参数rowData是要增加的数据记录内容
	public void addRow(Object[] rowData) {
		model.addRow(rowData);
		int nextRow = model.getRowCount();
		table.setRowSelectionInterval(nextRow-1, nextRow-1);
	}
	// 为该管理器增加对数据库的操作按钮
	// 参数:String label - 显示在按钮上的文本
	//		char mnemonic - 按钮的快捷键
	//		String toolTipText - 按钮的工具提示
	//		String actionCommand - 按钮的动作命令名称
	//		ActionListener listener - 按钮的动作监听器
	public void addOperationButton(String label, char mnemonic, String toolTipText, 
			String actionCommand, ActionListener listener) {
		JButton button = new JButton(label);
		button.setMnemonic(mnemonic);
		button.setToolTipText(toolTipText);
		button.setActionCommand(actionCommand);
		button.addActionListener(listener);
		// 使用面板缺省的顺序布局管理器将按钮加入到控制面板
		controlPane.add(button);
	}
	// 关闭管理器
	public void close() throws Exception {
		// 从基础容器ground中删除managerPane,再repaint()基础容器
		// 即可清除managerPane所给出的各种界面。
		ground.remove(managerPane);
		ground.repaint();
	}
	// 管理器所使用的表格数据模型上的监听器,监听对表格单元的变化,并调用方法updateFieldValue()
	// 修改相应数据库的内容,如果用户允许直接在表格中修改则需要重定义方法updateFieldValue()。
	class DatabaseTableModelListener implements TableModelListener {
		public void tableChanged(TableModelEvent evt) {
			int row = evt.getFirstRow();		// 改变的表格行
			int col = evt.getColumn();			// 改变的表格列
			// 忽略除修改以外的事件
			if (evt.getType() != TableModelEvent.UPDATE) return;
			Object value = model.getValueAt(row, col);
			int keyCol = model.getKeyFieldColumn();
			Object keyId = model.getValueAt(row, keyCol);
			String fieldName = model.getFieldName(col);
			// 调用真正修改数据库的方法修改数据库中相应的内容
			updateFieldValue(keyId, fieldName, value);
		}
	}
}
// 描述数据库字段(也是数据库管理器中的表列)信息
class DatabaseTableColumn {
	private String name;	// 表格列名(列标题)
	private String field;	// 表列所对应的字段名称
	private Class type;	// 表列的类型所属的类
	private int width;		// 表列宽度
	private int sqlType;	// 表列类型在Sql中的编码值

	public DatabaseTableColumn(String name, String field, Class type, 
			int width, int sqlType) {
		this.name = name;  this.field = field;
		this.type = type;  this.width = width;
		this.sqlType = sqlType;
	}
	public String getName() { return name; }
	public String getField() { return field; }
	public Class getType() { return type; }
	public int getWidth() { return width; }
	public int getSqlType() { return sqlType; }
}
// 数据库管理器的表格所使用的缺省数据模型,用户也可对此进行扩展
class DatabaseTableModel extends AbstractTableModel {
	protected DatabaseTableColumn[] columns;	// 表列信息
	protected int keyCol;					// 关键字段所在的列
	// 表格中的数据,ArrayList的元素类型是Object[],长度为columnNames.length
	protected ArrayList data;				
	// 指明使用该模型的表格是否可修改表格单元,注意关键字段所在的列总是不可修改的
	protected boolean modifiable;	

	public DatabaseTableModel(ArrayList data, DatabaseTableColumn[] columns, 
			String keyField, boolean modifiable) {
		this.data = data;
		this.columns = columns;
		keyCol = 0;
		for (int i = 0; i < columns.length; i++) {
			if (keyField.equals(columns[i].getField())) { keyCol = i;  break; }
		}
		this.modifiable = modifiable;
	}
	//// 以下方法在类AbstractTableModel定义为抽象方法,必须重定义它们
	// 返回表列数
	public int getColumnCount() { return columns.length; }
	// 返回表列名称
	public String getColumnName(int col) { return columns[col].getName(); }
	// 返回表列数据所属的类型
	public Class getColumnClass(int col) { return columns[col].getType(); }
	// 返回列的表格单元是否可修改
	public boolean isCellEditable(int row, int col) {
		// 屏幕上显示的表格列可由用户拖动,但用户拖动列不会改变内部数据模型的列的顺序
		if (col == keyCol) return false;		// 关键字段所在的列不可编辑
		else return modifiable;
	}
	// 返回某个表格单元的数据
	public Object getValueAt(int row, int col) { 
		Object[] rowData = (Object[])data.get(row);
		return rowData[col]; 
	}
	// 设置某个表格单元的数据
	public void setValueAt(Object value, int row, int col) {
		Object[] rowData = (Object[])data.get(row);
		rowData[col] = value;
		data.set(row, rowData);
		fireTableCellUpdated(row, col);	// 触发模型被改变的事件,以相应地改变表格外观
	}
	//// 以下方法是针对数据库管理的一些需要而增加的方法
	// 返回表行数
	public int getRowCount() { return data.size(); }
	// 返回表格第col列所对应的数据字段名称
	public String getFieldName(int col) { return columns[col].getField(); }
	// 返回关键字段在表格中的列下标
	public int getKeyFieldColumn() { return keyCol; }
	// 返回关键字段值为keyId的记录在表格中的行下标
	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;
	}
	// 增加一行数据
	public void addRow(Object[] rowData) {
		data.add(rowData);
		fireTableRowsInserted(data.size(), data.size());
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -