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

📄 personmanager.java

📁 运用三层结构开发的小型管理系统
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -