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

📄 databasemanager.java

📁 基于java swing的联机考试系统
💻 JAVA
字号:
package olts.presentation;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

/**
 * 管理数据库的基础类,包括创建交互界面的基础功能,可在此基础上拓展数据库的管理
 * @author Xia Wei
 * @author 2007.12.18
 * @version 1.0
 */
public class DatabaseManager {
	// 属性描述
	protected Container ground;                         // 创建试题维护界面的面板放置的容器。使用时应该是主画框的面板。
	protected DatabaseTableModel model;
	
	// 关于试题库维护的
	private JPanel ItemMaintancePane = null;	        // 存放试题维护界面的面板
	private JPanel ItemMaintanceCenterPane = null;      //
	protected JPanel NorthControlPane = null;		    // 存放管理器操作按钮的面板,位于itemmanagerPane.NORTH中
	protected JPanel SouthControlPane = null;
	// 关于更新的
	protected JPanel UpdateItemPane = null;	            // 更新试题面板,位于ItemMaintanceCenterPane 第一区
	protected JPanel UpdateControlPane = null;          // 更新试题按钮面板
	protected JScrollPane tableScrollPane = null;	    // 存放管理器的表格的滚动面板,位于UpdateItemPane.center
	protected JTable table = null;			            // 管理器中的表格,位于tableScrollPane中
	
	// 关于查询的
	protected JPanel SelectItemPane = null; 	        // 查看试题面板位于ItemMaintanceCenterPane第二区
	protected JPanel SelectItemCenterPane = null;
	protected JPanel SelectControlPane = null;          // 查询试题按钮面板
	// 标识取题
	protected JTable tableForSelectItem = null;			// 存放查询的试题的Swing表格,位于tableScrollPaneForGetItem中
	protected JScrollPane tableScrollPaneForSelectItem = null;
	protected DatabaseTableModel modelForSelectItem;
	// 难度系数取题
	protected JTable tableForSelectItemByDiff = null;
	protected JScrollPane tableScrollPaneForSelectItemByDiff = null;
	protected DatabaseTableModel modelForSelectItemByDiff;
	
	/**
	 * 创建用于试题维护的管理面板
	 * @param ground 放置此方法创建的面板的容器
	 * @param model 此方法创建的面板中表格的数据模型
	 */
	public void createItemManager(Container ground, DatabaseTableModel model) {
		this.ground = ground;
		this.model = model;
		// 监听对表格内数据的动作
		model.addTableModelListener(new DatabaseTableModelListener());
		table = new JTable(model);
		// 设置表格每一列的最佳宽度,该宽度还与字体有关,先计算一下表格使用的缺省字体的宽度
		int fontSize = table.getFont().getSize();
		TableColumn column = null;
		for (int i = 0; i < model.getColumnCount(); i++) {
			column = table.getColumnModel().getColumn(i);		// 获取列对象
			column.setPreferredWidth(model.getColumnWidth(i)*fontSize); 
		}
		// 将表格放置在一滚动窗格中,即表格滚动面板
		tableScrollPane = new JScrollPane(table);
		// 按钮控制面板,2个,用于放置操作数据的按钮
		NorthControlPane = new JPanel();
		SouthControlPane = new JPanel();
		// 试题维护面板,用于放置按钮控制面板和表格滚动面板
		ItemMaintancePane = new JPanel();
		ItemMaintancePane.setLayout(new BorderLayout());
		// ItemMaintancePane.NORTH方位
		ItemMaintancePane.add(NorthControlPane, BorderLayout.NORTH); 
		// ItemMaintancePane.CENTER方位
		ItemMaintanceCenterPane = new JPanel(new GridLayout(2,1,5,5));
		ItemMaintancePane.add(ItemMaintanceCenterPane, BorderLayout.CENTER);
		// ItemMaintanceCenterPane 第一区,更新试题区
		UpdateItemPane = new JPanel(new BorderLayout());
		UpdateItemPane.setBorder(BorderFactory.createTitledBorder(" 更新试题"));
		UpdateItemPane.add(tableScrollPane,BorderLayout.CENTER);
		ItemMaintanceCenterPane.add(UpdateItemPane); 
		// ItemMaintanceCenterPane 第二区,查询试题区
		SelectItemPane =new JPanel(new BorderLayout());
		SelectItemPane.setBorder(BorderFactory.createTitledBorder(" 查询试题 -- -- 查询提示:输入试题标识或难度系数后再提交"));
		SelectItemCenterPane = new JPanel(new BorderLayout());
		SelectItemPane.add(SelectItemCenterPane, BorderLayout.CENTER);
		ItemMaintanceCenterPane.add(SelectItemPane);
		// ItemMaintancePane.SOUTH
		ItemMaintancePane.add(SouthControlPane, BorderLayout.SOUTH);
		ground.setLayout(new BorderLayout());
		ground.add(ItemMaintancePane,BorderLayout.CENTER);
	}
	
	/**
	 * 创建标识取题的显示试题表格的滚动管理器面板,此面板在createItemManager()方法创建的面板中
	 * @param modelForSelectItem 此方法创建的管理器面板中表格的数据模型
	 */
	public void createItemManagerForIdSelect(DatabaseTableModel modelForSelectItem) {
		this.modelForSelectItem = modelForSelectItem;
		//modelForSelectItem.addTableModelListener(new DatabaseTableModelListener());
		tableForSelectItem = new JTable(modelForSelectItem);
		// 设置表格每一列的最佳宽度,该宽度还与字体有关,先计算一下表格使用的缺省字体的宽度
		int fontSize = tableForSelectItem.getFont().getSize();
		TableColumn column = null;
		for (int i = 0; i < modelForSelectItem.getColumnCount(); i++) {
			column = tableForSelectItem.getColumnModel().getColumn(i);
			column.setPreferredWidth(modelForSelectItem.getColumnWidth(i)*fontSize); 
		}
		// 将表格放置在一滚动窗格中,即表格滚动面板
		tableScrollPaneForSelectItem = new JScrollPane(tableForSelectItem);
		tableScrollPaneForSelectItem.setBorder(BorderFactory.createTitledBorder("按标识所取试题如下:"));
		tableForSelectItem.setVisible(true);
		SelectItemCenterPane.add(tableScrollPaneForSelectItem,BorderLayout.CENTER);
		tableScrollPaneForSelectItem.validate();
	}
	
	/**
	 * 创建难度取题的显示试题表格的滚动管理器面板,此面板在createItemManager()方法创建的面板中
	 * @param modelForSelectItemByDiff 此方法创建的管理器面板中表格的数据模型
	 */
	public void createItemManagerForDiffSelect(DatabaseTableModel modelForSelectItemByDiff) {
		this.modelForSelectItemByDiff = modelForSelectItemByDiff;
		tableForSelectItemByDiff = new JTable(modelForSelectItemByDiff);
		int fontSize = tableForSelectItemByDiff.getFont().getSize();
		TableColumn column = null;
		for (int i = 0; i < modelForSelectItemByDiff.getColumnCount(); i++) {
			column = tableForSelectItemByDiff.getColumnModel().getColumn(i);
			column.setPreferredWidth(modelForSelectItemByDiff.getColumnWidth(i)*fontSize); 
		}
		tableScrollPaneForSelectItemByDiff = new JScrollPane(tableForSelectItemByDiff);
		tableScrollPaneForSelectItemByDiff.setBorder(BorderFactory.createTitledBorder("按难度所取试题如下:"));
		tableForSelectItemByDiff.setVisible(true);
		SelectItemCenterPane.add(tableScrollPaneForSelectItemByDiff,BorderLayout.CENTER);
		tableScrollPaneForSelectItemByDiff.validate();
	}
	
	/**
	 * 用关键字段值找表格行
	 * @param keyId 指定关键字段的值
	 * @return 如果管理器的表格中存在关键字段值为keyId的值,则选中该表格行,并返回true,返回false表示不存在该表格行
	 */
	public boolean setSelectionRow(Object keyId) {
		int row = model.getKeyIdRow(keyId);
		if (row >= 0) { table.setRowSelectionInterval(row, row);  return true; }
		else return false;
	}
	
	/**
	 * 返回当前选中的表格行的关键字段的值
	 * @return 当前选中的表格行的关键字段值
	 */
	public Object getSelectionRowKey() {
		int row = table.getSelectedRow();
		if (row < 0) return null;
		int col = model.getKeyFieldColumn();
		return model.getValueAt(row, col);
	}
	
	/**
	 * 通过关键字段值对表格进行真正修改;如果该管理器可修改数据库中的数据,则调用下述方法对数据库进行真正的修改.此方法在子类中实现。
	 * @param keyId 要修改的数据记录的关键字段值
	 * @param modifyField 要修改的数据域的名称
	 * @param newValue 数据域的新值
	 */
	public void updateFieldValue(Object keyId, String modifyField, Object newValue) {}
	
	/**
	 * 通过关键字段值删除表格中的一行
	 * @param keyId 要删除的数据记录的关键字段值
	 */
	public void removeRow(Object keyId) {
		int currentRow = model.getKeyIdRow(keyId);
		int nextRow = currentRow;
		if (nextRow > model.getRowCount()) nextRow = model.getRowCount();
		if (nextRow <= 0) nextRow = 0;
		model.removeRow(keyId);
	}
	
	/**
	 * 在表格中增加一行
	 * @param rowData 要增加的数据记录内容
	 */
	public void addRow(Object[] rowData) {
		model.addRow(rowData);
		int nextRow = model.getRowCount();
		table.setRowSelectionInterval(nextRow-1, nextRow-1);
	}
	
	/**
	 * 关闭试题维护管理器面板
	 */
	public void closeitemmanagerPane() throws Exception {
		// 移除窗格中的子组件 component,达到关闭的目的
		ground.remove(ItemMaintancePane);
		ground.repaint();
	}
	
	/**
	 * 表格数据模型上的监听器,监听对表格单元的变化,并调用方法updateFieldValue()修改相应数据库的内容。
	 * 如果用户允许直接在表格中修改则需要重定义方法updateFieldValue()。
	 */
	class DatabaseTableModelListener implements TableModelListener {
		public void tableChanged(TableModelEvent evt) {
			// getFirstRow()返回第一个被更改的行
			int row = evt.getFirstRow();		// 改变的表格行
			// getColumn()返回事件的列。如果返回值为 ALL_COLUMNS,则意味着指定行中的所有列都被更改。
			int col = evt.getColumn();			// 改变的表格列
			// 忽略除修改以外的事件
			// getType()返回事件类型,包括INSERT、UPDATE 和 DELETE。
			if (evt.getType() != TableModelEvent.UPDATE) return;
			// 获取修改前的值
			Object value = model.getValueAt(row, col);
			// 获得关键字段值所在的列序号
			int keyCol = model.getKeyFieldColumn();
			// 返回row行的关键字段值
			Object keyId = model.getValueAt(row, keyCol);
			// 获得col列的数据字段名
			String fieldName = model.getFieldName(col);
			// 调用真正修改数据库的方法修改数据库中相应的内容
			updateFieldValue(keyId, fieldName, value);
		}
	}
}

⌨️ 快捷键说明

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