📄 personmanager.java
字号:
package phoneBookManager;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;
import java.util.*;
import java.sql.Date;
//管理表Person的管理器
public class PersonManager extends DatabaseManager implements ActionListener {
private Person person = null;
// 维护人员信息录入界面的输入器
private PersonRecordInputor inputor = new PersonRecordInputor();
// 构造方法,主要是初始化person,调用它的open()方法建立与数据库的连接
public PersonManager() throws Exception {
person = new Person();
person.open();
}
// 创建用于管理人员信息的面板
public void createManagerPane(Container ground) throws Exception {
ArrayList data = person.findAll();
DatabaseTableColumn[] columns = person.getColumns();
String keyField = person.getKeyField();
model = new PersonTableModel(data, columns, keyField, true);
createManagerPane(ground, model);
addOperationButton("添加(A)", 'I', "添加新的人员信息", "APPEND", this);
addOperationButton("修改(M)", 'M', "修改当前人员信息", "UPDATE", this);
addOperationButton("删除(D)", 'D', "修改当前人员信息", "DELETE", this);
addOperationButton("放大(Z)", 'Z', "浏览当前人员信息", "BROWSE", this);
}
// 当用户对管理器中的表格进行编辑时,调用person的update()方法修改数据库中相应内容
public void updateFieldValue(Object keyId, String modifyField, Object newValue) {
try {
person.update((String)keyId, modifyField, newValue);
} catch (Exception exc) {
exc.printStackTrace();
}
}
// 返回当前选中的记录
public PersonRecord getCurrentRecord() {
PersonRecord record = new PersonRecord();
int row = table.getSelectedRow();
for (int col = 0; col < model.getColumnCount(); col++) {
String fieldName = model.getFieldName(col);
if (fieldName.equals("id")) record.id = (String)model.getValueAt(row, col);
else if (fieldName.equals("name")) record.name = (String)model.getValueAt(row, col);
else if (fieldName.equals("sex")) record.sex = (String)model.getValueAt(row, col);
else if (fieldName.equals("birthday")) {
record.birthday = (Date)model.getValueAt(row, col);
}
else if (fieldName.equals("address")) record.address = (String)model.getValueAt(row, col);
else if (fieldName.equals("resume")) record.resume = (String)model.getValueAt(row, col);
}
return record;
}
// 关闭数据库连接及关闭管理器界面
public void close() throws Exception {
person.close();
super.close();
}
// 添加一个人员信息
public void append() {
// 插入人员信息,使用输入器让让用户输入人员信息
PersonRecord personRecord = inputor.input(null);
if (personRecord == null) return; // 用户放弃了输入
try {
// 调用Person的add()方法将用户输入的人员信息插入到数据表
person.add(personRecord);
} catch (Exception exc) {
JOptionPane.showMessageDialog(MainFrame.getMainFrame(), "向数据库添加人员信息失败,原因可见控制台打印的异常信息!");
exc.printStackTrace();
return;
}
Object[] rowData = person.recordToArray(personRecord);
// 调用DatabaseManager的addRow()方法将用户输入人员信息插入到Swing表格
addRow(rowData);
}
// 修改当前Swing表格中选中的人员的信息
public void update() {
// 获取在Swing表格中当前选中的人员信息记录
PersonRecord currentRecord = getCurrentRecord();
// 记住该人员代码,以方便后面的修改
String oldId = new String(currentRecord.id);
// 修改人员信息,使用输入器让用户输入人员信息
currentRecord = inputor.input(currentRecord);
if (currentRecord == null) return; // 用户放弃了输入
try {
// 调用Person的update()方法修改数据库表中代码为 oldId 的人员信息
person.update(oldId, currentRecord);
} catch (Exception exc) {
JOptionPane.showMessageDialog(MainFrame.getMainFrame(), "修改数据库中的人员信息失败,原因可见控制台打印的异常信息!");
exc.printStackTrace();
return;
}
Object[] rowData = person.recordToArray(currentRecord);
// 调用DatabaseManager的modifyCurrentRow()方法修改Swing表格中当前选中的人员信息
modifyCurrentRow(rowData);
}
// 放大浏览当前人员的信息
public void browse() {
// 获取在Swing表格中当前选中的人员信息记录
PersonRecord currentRecord = getCurrentRecord();
// 使用输入器浏览人员信息
inputor.browse(currentRecord);
}
// 删除当前人员信息
public void remove() {
// 弹出窗口让用户确认真的删除当前选中的人员信息
int n = JOptionPane.showConfirmDialog(MainFrame.getMainFrame(), "确认删除当前的人员信息?", "删除确认",
JOptionPane.YES_NO_CANCEL_OPTION, // 决定使用什么按钮
JOptionPane.QUESTION_MESSAGE); // 决定使用什么图标
if (n == JOptionPane.YES_OPTION) {
// 用户确认删除当前信息
try {
// 调用 person 的 remove 方法删除数据表中代码为当前Swing表格中选中的人员代码的记录
person.remove((String)getCurrentKeyId());
} catch (Exception exc) {
JOptionPane.showMessageDialog(MainFrame.getMainFrame(), "删除数据库中的人员信息失败,原因可见控制台打印的异常信息!");
exc.printStackTrace();
return;
}
// 删除Swing表格中的当前选中的行
deleteCurrentRow();
}
}
// 监听在管理器界面上添加的插入按钮,完成对人员信息的添加、放大、更新以及删除等操作
public void actionPerformed(ActionEvent evt) {
String command = ((JButton)evt.getSource()).getActionCommand();
if (command.equals("APPEND")) append();
else if (command.equals("BROWSE")) browse();
else if (command.equals("UPDATE")) update();
else if (command.equals("DELETE")) remove();
}
}
class PersonTableModel extends DatabaseTableModel {
public PersonTableModel(ArrayList data, DatabaseTableColumn[] columns, String keyField, boolean modifiable) {
super(data, columns, keyField, modifiable);
}
// 返回列的表格单元是否可修改
public boolean isCellEditable(int row, int col) {
// 屏幕上显示的表格列可由用户拖动,但用户拖动列不会改变内部数据模型的列的顺序
if (col == keyCol) return false; // 关键字段所在的列不可编辑
else if (getColumnName(col).equals("性别")) return false;
else return modifiable;
}
}
// 维护输入一个人员信息的对话框,从而可用于添加、更新以及放大浏览人员信息
class PersonRecordInputor extends JDialog {
private Container place; // 创建的标签应该放置的容器,通常应该是窗格
private JTextField idField; // 用于输入id的文本字段
private JTextField nameField; // 用于输入姓名的文本字段
private JRadioButton maleButton, femaleButton; // 用于确定性别的广播按钮
private JTextField dateField; // 用于输入生日日期
private JTextField addressField; // 用于输入姓名的文本字段
private JTextArea resumeArea; // 用于输入个人简历的文本区域
// 输入的信息将汇总到 record 中
private PersonRecord record = new PersonRecord();
// 记录用户是否放弃了输入的信息,只有当 isValidate 为 true 时,record 中的信息才是有效的
private boolean isValidate = false;
public PersonRecordInputor() {
super(MainFrame.getMainFrame(), "输入人员信息", true);
// 关闭对话框时,视为放弃输入
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
closeAndCancel();
}
});
// 创建输入人员信息的各种控件
create();
pack();
// 下面的代码将对话框移到屏幕中间
int startX = (MainFrame.screenWidth - getWidth())/2;
if (startX <= 0) startX = 0;
int startY = (MainFrame.screenHeight - getHeight())/2;
if (startY <= 0) startY = 0;
setLocation(startX, startY);
}
// 输入一个人员的信息
// 参数:initRecord 不为空时,人员信息的初始值取自该记录,这时是修改该人员的信息
// 当它为空时,人员信息的初始值为空,这时是添加一个新的人员信息
public PersonRecord input(PersonRecord initRecord) {
// 利用 initRecord 设置各控件的初始值
setDefaultValue(initRecord);
// 当 initRecord 不为空时,不允许修改人员代码信息
if (initRecord != null) idField.setEnabled(false);
// 是对话框可见,从而接受用户的输入
setVisible(true);
// 输入完毕之后,恢复输入人员代码的控件的可用性
idField.setEnabled(true);
// 如果是按确认退出对话框,则isValidate 为true ,这时输入的信息汇总在 record 中
if (isValidate) return record;
else return null; // 否则,用户放弃了输入的信息,返回 null
}
// 放大浏览一个人员的信息
// 参数:currentRecord 记录要浏览的人员信息
public void browse(PersonRecord currentRecord) {
// 利用 currentRecord 设置各控件的初始值
setDefaultValue(currentRecord);
// 放大浏览时不允许用户对控件中的内容进行编辑修改
setEditable(false);
// 使对话框可见,从而让用户浏览信息
setVisible(true);
// 关闭对话框之后,恢复各控件的可编辑性
setEditable(true);
}
// 设置输入人员信息的各控件的可编辑性
private void setEditable(boolean e) {
idField.setEditable(e);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -