📄 databasemanager.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 + -