项目——学生信息管理系统7

news2025/1/31 8:26:15

目录

学生选课功能的介绍

把 课程的数据库表创建出来

创建实体类

创建添加课程页面 AddCourseFrm,注意创建成JInternalFrame类型

页面制作,具体参照之前的

回到 MainFrm 添加课程管理菜单项

给添加课程按钮绑定事件

回到AddCourseFrm 页面

1. 把教师的名字展示到下拉框

2. 在构造函数里面调用一下 setTeacherCombox()

3. 创建CourseDao 并提供添加课程的方法

4. 给添加按钮绑定点击事件

提供一个重置表单的方法

创建课程管理页面 ManageCourseFrm 创建成JInternalFrame类型

页面制作如下

ManageCourseFrm页面一打开,填充表格数据

首先在 CourseDao 中提供查询的方法

在构造函数中调用 setCourseListTable() 方法

在 ManageCourseFrm 提供一个 根据教师id返回教师名的方法

回到MainFrm 给课程列表按钮添加事件

在编辑下拉框里面展示老师的姓名

给删除按钮绑定点击事件,进行删除

首先在 CourseDao.java 中提供删除的方法

给查询按钮添加事件

给表格的每一行添加 点击事件

提供一个 根据教师姓名返回id 的方法,因为上面调用了

给修改按钮绑定事件

首先在 CourseDao.java 中提供修改的方法

下来创建一张选课表,也就是中间表

创建中间表对应的实体类

选课界面的制作

创建 ManageSelectedCourseFrm 页面 注意创建成 JInternalFrame类型

给组件起个名字

回到 MainFrm 添加选课管理按钮

给选择课程按钮绑定点击事件

重写 Student类的toString方法,返回学生姓名

当 ManageSelectedCourseFrm 页面一打开,给学生和课程下拉框填充数据

首先在 ManageSelectedCourseFrm 的成员变量位置,定义两个集合

在 ManageSelectedCourseFrm 中提供两个方法

在构造方法中调用 setStudentCombox() 和 setCourseCombox() 方法

编写方法,获取学生已经选择的课程,显示在表格里面

首先,编写 SelectedCourseDao 提供查询所有课程的方法

在 ManageSelectedCourseFrm 定义一个initTable()的方法

在 ManageSelectedCourseFrm 定义一个getSelectedCourse()的方法

在构造方法中调用 initTable() 方法

给确认选课按钮,添加事件

首先在 SelectedCourseDao 中提供一个添加选课的方法

然后在 CourseDao.java 中 提供 一个判断的方法

再在 CourseDao.java 中提供更新已选课程数的方法

再在 SelectedCourseDao 中提供一个判断课程是否已经选过的方法

处理确认选课操作

启动测试

给学生下拉框添加一个下拉项选择事件,当我们下拉切换选项时,查询学生已经选择的课程,展示在表格中

说明:这个 itemStateChanged 事件,当你切换下拉选择时,会触发两次,我们只要你选中后的那一次,所以我们可以判断

启动测试

给表格的每一行,添加一个点击事件,点击每一行时,回显这行数据到编辑区

测试

给确认修改按钮,添加事件

在 SelectedCourseDao 中提供 更新课程的方法

编写 editSelectCourseAct(ae) 方法,确认更新

测试

给退选课程按钮,添加事件

在 SelectedCourseDao 中提供删除课程的方法

退选课程

启动测试

设置角色权限

如果是学生身份登录,那么课程管理按钮禁用。

回到MainFrm 进行判断

测试

在选课管理里面,学生只能查看自己的选课,不能查看其它学生的选课,只能修改和退选自己的课程。

在构造方法里面调用 setAuthority() 方法

修改 setStudentCombox()方法,加上学生身份的判断

测试


学生选课功能的介绍

课程管理,选课管理

把 课程的数据库表创建出来

CREATE TABLE `s_course` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `teacher_id` int(5) NOT NULL,
  `max_student_num` int(3) NOT NULL,
  `info` varchar(512) DEFAULT NULL,
  `selected_num` int(3) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `teacher_foreign` (`teacher_id`),
  CONSTRAINT `teacher_foreign` FOREIGN KEY (`teacher_id`) REFERENCES `s_teacher` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
​
-- ----------------------------
-- Records of s_course
-- ----------------------------
INSERT INTO `s_course` VALUES ('1', '大学数学', '3', '50', '数学课程', '3');
INSERT INTO `s_course` VALUES ('2', '大学英语', '4', '45', '大英3', '2');
INSERT INTO `s_course` VALUES ('3', '原子弹原理技术', '5', '66', '制造原子弹技术,很牛逼!', '1');
INSERT INTO `s_course` VALUES ('4', '软件工程', '3', '66', '666', '1');
INSERT INTO `s_course` VALUES ('5', '计算机原理', '4', '45', '计算机组成原理,非常重要。', '1');
INSERT INTO `s_course` VALUES ('6', '人工智能', '5', '2', '人工智能课程。', '1');

创建实体类

public class Course {
    private int id;  //课程id
    private String name; //课程名称
    private int teacher_id; //授课教师
    private int max_student_num; //课程最大选课数
    private String info; //课程信息
    private int selected_num = 0; //已选择数量 默认值0
    //get set 方法自己补上
}   

创建添加课程页面 AddCourseFrm,注意创建成JInternalFrame类型

页面制作,具体参照之前的

给组件起个名字

    private JTextField courseNameTextField;
    private JTextField studentNumTextField;
    private JComboBox teacherListComboBox;
    private JTextArea courseInfoTextArea;

回到 MainFrm 添加课程管理菜单项

给添加课程按钮绑定事件

//添加课程,事件
        mntmNewMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                openAddCourseFrm(e);
            }
        });
//打开添加课程页面
​
    protected void openAddCourseFrm(ActionEvent e) {
        
        AddCourseFrm addCourseFrm = new AddCourseFrm();
        addCourseFrm.setVisible(true);
        desktopPane.add(addCourseFrm);
        
    }

回到AddCourseFrm 页面

1. 把教师的名字展示到下拉框

在 AddCourseFrm 里面添加一个方法

//设置教师的下拉框
    private void setTeacherCombox(){
        TeacherDao teacherDao = new TeacherDao();
        List<Teacher> teacherList = teacherDao.getTeacherList(new Teacher());
        
        for (Teacher teacher : teacherList) {
            teacherListComboBox.addItem(teacher); //这里,去重写一下Teacher 的toString方法,返回教师姓名
        }
    }

2. 在构造函数里面调用一下 setTeacherCombox()

//调用设置教师的下拉框
        setTeacherCombox();

测试一下

3. 创建CourseDao 并提供添加课程的方法

public class CourseDao  {
    public boolean addCourse(Course course){
        String sql = "insert into s_course values(null,?,?,?,?,0)";
        try {
            Connection con = JDBCUtils.getConnection();
            java.sql.PreparedStatement preparedStatement = con.prepareStatement(sql);
            preparedStatement.setString(1, course.getName());
            preparedStatement.setInt(2, course.getTeacher_id());
            preparedStatement.setInt(3, course.getMax_student_num());
            preparedStatement.setString(4, course.getInfo());
            if(preparedStatement.executeUpdate() > 0)return true;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }
}   

4. 给添加按钮绑定点击事件

addCourseButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				addCourseAct(ae);
			}
		});
//添加课程
	protected void addCourseAct(ActionEvent ae) {
		// TODO Auto-generated method stub
		String couserName = courseNameTextField.getText().toString();
		String courseInfo = courseInfoTextArea.getText().toString();
		Teacher selectedTeacher = (Teacher)teacherListComboBox.getSelectedItem();
		int studentMaxNum = 0;
		try {
			studentMaxNum = Integer.parseInt(studentNumTextField.getText());
		} catch (Exception e) {
			// TODO: handle exception
			JOptionPane.showMessageDialog(this, "学生人数只能输入数字!");
			return;
		}
		if(StringUtil.isEmpty(couserName)){
			JOptionPane.showMessageDialog(this, "请输入课程名称!");
			return;
		}
		if(studentMaxNum <= 0){
			JOptionPane.showMessageDialog(this, "学生人数只能输入大于0的数字!");
			return;
		}
		Course course = new Course();
		course.setName(couserName);
		course.setMax_student_num(studentMaxNum);
		course.setInfo(courseInfo);
		course.setTeacher_id(selectedTeacher.getId());
		CourseDao courseDao = new CourseDao();
		if(courseDao.addCourse(course)){
			JOptionPane.showMessageDialog(this, "添加成功!");
		}else{
			JOptionPane.showMessageDialog(this, "添加失败!");
		}
		//添加完重置表单
		resetValue(ae);
	}
	

提供一个重置表单的方法

//重置表单
	protected void resetValue(ActionEvent ae) {
		// TODO Auto-generated method stub
		courseNameTextField.setText("");
		courseInfoTextArea.setText("");
		studentNumTextField.setText("");
		teacherListComboBox.setSelectedIndex(0);
	}

自己测试一下

创建课程管理页面 ManageCourseFrm 创建成JInternalFrame类型

页面制作如下

给组件起个名字

   private JTextField searchCourseNameTextField;
	private JTable courseListTable;
	private JTextField editCourseTextField;
	private JTextField editCourseStudentNumTextField;
	private JComboBox editCourseTeachComboBox;
	private JTextArea editCourseInfoTextArea;
	private JComboBox searchTeacherComboBox;

ManageCourseFrm页面一打开,填充表格数据

首先在 CourseDao 中提供查询的方法

// 查询课程
	public List<Course> getCourseList(Course course) {
		List<Course> retList = new ArrayList<Course>();
		StringBuffer sqlString = new StringBuffer("select * from s_course");
		if (!StringUtil.isEmpty(course.getName())) {
			sqlString.append(" and name like '%" + course.getName() + "%'");
		}
		if (course.getTeacher_id() != 0) {
			sqlString.append(" and teacher_id =" + course.getTeacher_id());
		}
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con
					.prepareStatement(sqlString.toString().replaceFirst("and", "where"));
			ResultSet executeQuery = preparedStatement.executeQuery();
			while (executeQuery.next()) {
				Course c = new Course();
				c.setId(executeQuery.getInt("id"));
				c.setName(executeQuery.getString("name"));
				c.setTeacher_id(executeQuery.getInt("teacher_id"));
				c.setMax_student_num(executeQuery.getInt("max_student_num"));
				c.setInfo(executeQuery.getString("info"));
				c.setSelected_num(executeQuery.getInt("selected_num"));
				retList.add(c);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return retList;
	}

在 ManageCourseFrm 中定义填充表格的方法setCourseListTable()

//填充表格数据
	private void setCourseListTable(Course course) {
		CourseDao courseDao = new CourseDao();
		List<Course> courseList = courseDao.getCourseList(course);
		DefaultTableModel dft = (DefaultTableModel) courseListTable.getModel();
		dft.setRowCount(0);
		for (Course c : courseList) {
			Vector v = new Vector();
			v.add(c.getId());
			v.add(c.getName());
			v.add(getTeacherNameById(c.getTeacher_id()));
			v.add(c.getMax_student_num());
			v.add(c.getSelected_num());
			v.add(c.getInfo());
			dft.addRow(v);
		}
		
	}
在构造函数中调用 setCourseListTable() 方法
setCourseListTable(new Course());

在 ManageCourseFrm 提供一个 根据教师id返回教师名的方法

//根据教师id, 教师姓名
	private String getTeacherNameById(int teacher_id) {
		String retString = "";
		for (Teacher teacher : teacherList) {
			if (teacher.getId() == teacher_id) {
				retString = teacher.getName();
				break;
			}
		}
		return retString;
	}

回到MainFrm 给课程列表按钮添加事件

//课程列表按钮,事件
	mntmNewMenuItem_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				openManageCourseFrm(e);
			}
		});

//打开课程列表页面
	protected void openManageCourseFrm(ActionEvent e) {
		// TODO Auto-generated method stub
		ManageCourseFrm manageCourseFrm = new ManageCourseFrm();
		manageCourseFrm.setVisible(true);
		desktopPane.add(manageCourseFrm);
		
	}

测试

在编辑下拉框里面展示老师的姓名

在 ManageCourseFrm 中定义 方法

//编辑下拉框里面展示老师姓名
	private void setTeacherCombox() {
		TeacherDao teacherDao = new TeacherDao();
		teacherList = teacherDao.getTeacherList(new Teacher());
		
		for (Teacher teacher : teacherList) {
			editCourseTeachComboBox.addItem(teacher);
			searchTeacherComboBox.addItem(teacher);
		}
	}

在构造数中调用 setTeacherCombox() 方法

//下拉框展示老师姓名
		setTeacherCombox();

给删除按钮绑定点击事件,进行删除

首先在 CourseDao.java 中提供删除的方法

//删除的方法
	public boolean delete(int id) {
		String sql = "delete from s_course where id=?";
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sql);
			preparedStatement.setInt(1, id);
			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}

//删除按钮,绑定事件
		deleteCourseButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				deleteCourse(ae);
			}
		});
//删除操作
	protected void deleteCourse(ActionEvent ae) {
		// TODO Auto-generated method stub
		int row = courseListTable.getSelectedRow();
		if (row == -1) {
			JOptionPane.showMessageDialog(this, "请选中要删除的数据!");
			return;
		}
		int course_id = Integer.parseInt(courseListTable.getValueAt(row, 0).toString());
		CourseDao courseDao = new CourseDao();
		if (courseDao.delete(course_id)) {
			JOptionPane.showMessageDialog(this, "删除成功!");
		} else {
			JOptionPane.showMessageDialog(this, "删除失败!");
		}
		
		setCourseListTable(new Course());
	}

自己测试一下删除

给查询按钮添加事件

//查询按钮,事件绑定
		searchButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				searchCourse(ae);
			}
		});
//查询
	protected void searchCourse(ActionEvent ae) {
		// TODO Auto-generated method stub
		String searchCourseName = searchCourseNameTextField.getText().toString();
		Teacher teacher = (Teacher) searchTeacherComboBox.getSelectedItem();
		Course course = new Course();
		course.setName(searchCourseName);
		course.setTeacher_id(teacher.getId());
		setCourseListTable(course);
	}

给表格的每一行添加 点击事件

//表格每一 行,点击事件
		courseListTable.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent me) {
				selectedCourse(me);
			}
		});

//点击表格每一行,回显到编辑区
	protected void selectedCourse(MouseEvent me) {
		// TODO Auto-generated method stub
		int row = courseListTable.getSelectedRow();
		String couseName = courseListTable.getValueAt(row, 1).toString();
        //根据教师姓名返回教师id
		int teacher_id = getTeacherIdByName(courseListTable.getValueAt(row, 2).toString());
		int max_student_num = Integer.parseInt(courseListTable.getValueAt(row, 3).toString());
		String couseInfo = courseListTable.getValueAt(row, 5).toString();
		editCourseTextField.setText(couseName);
		editCourseStudentNumTextField.setText(max_student_num + "");
		editCourseInfoTextArea.setText(couseInfo);
		for (int i = 0; i < editCourseTeachComboBox.getItemCount(); i++) {
			Teacher t = (Teacher) editCourseTeachComboBox.getItemAt(i);
			if (t.getId() == teacher_id) {
				editCourseTeachComboBox.setSelectedIndex(i);
				break;
			}
		}
	}

提供一个 根据教师姓名返回id 的方法,因为上面调用了
//根据教师姓名返回id
	private int getTeacherIdByName(String teacher_name) {
		int retId = -1;
		for (Teacher teacher : teacherList) {
			if (teacher_name.equals(teacher.getName())) {
				retId = teacher.getId();
				break;
			}
		}
		return retId;
	}

自己测试下

给修改按钮绑定事件

首先在 CourseDao.java 中提供修改的方法

//修改的方法
	public boolean update(Course course) {
		String sql = "update s_course set name=?, teacher_id=?,max_student_num=?,info=? where id=?";
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sql);
			preparedStatement.setString(1, course.getName());
			preparedStatement.setInt(2, course.getTeacher_id());
			preparedStatement.setInt(3, course.getMax_student_num());
			preparedStatement.setString(4, course.getInfo());
			preparedStatement.setInt(5, course.getId());
			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}

	//确认修改按钮,事件
		submitEditButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				editCourseSubmit(ae);
			}
		});
//修改的方法
	protected void editCourseSubmit(ActionEvent ae) {
		// TODO Auto-generated method stub
		int row = courseListTable.getSelectedRow();
		if (row == -1) {
			JOptionPane.showMessageDialog(this, "请选中要修改的数据!");
			return;
		}
		int course_id = Integer.parseInt(courseListTable.getValueAt(row, 0).toString());
		Teacher teacher = (Teacher) editCourseTeachComboBox.getSelectedItem();
		String courseName = editCourseTextField.getText().toString();
		if (StringUtil.isEmpty(courseName)) {
			JOptionPane.showMessageDialog(this, "课程名称不能为空!");
			return;
		}
		int max_student_num = 0;
		try {
			max_student_num = Integer.parseInt(editCourseStudentNumTextField.getText().toString());
		} catch (Exception e) {
			// TODO: handle exception
			JOptionPane.showMessageDialog(this, "学生人数请输入大于0的整数!");
			return;
		}
		if (max_student_num <= 0) {
			JOptionPane.showMessageDialog(this, "学生人数请输入大于0的整数!");
			return;
		}
		String courseInfo = editCourseInfoTextArea.getText().toString();
		Course course = new Course();
		course.setId(course_id);
		course.setName(courseName);
		course.setTeacher_id(teacher.getId());
		course.setMax_student_num(max_student_num);
		course.setInfo(courseInfo);
		CourseDao courseDao = new CourseDao();
		if (courseDao.update(course)) {
			JOptionPane.showMessageDialog(this, "修改成功!");
		} else {
			JOptionPane.showMessageDialog(this, "修改失败!");
		}
		
		setCourseListTable(new Course());

	}

自己测试下

下来创建一张选课表,也就是中间表

因为 学生和课程之间是多对多的关系,所以得一张中间表

CREATE TABLE `s_selected_course` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `student_id` int(5) DEFAULT NULL,
  `course_id` int(5) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `student_foreign` (`student_id`),
  KEY `course_foreign` (`course_id`),
  CONSTRAINT `course_foreign` FOREIGN KEY (`course_id`) REFERENCES `s_course` (`id`),
  CONSTRAINT `student_foreign` FOREIGN KEY (`student_id`) REFERENCES `s_student` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of s_selected_course
-- ----------------------------
INSERT INTO `s_selected_course` VALUES ('12', '1', '1');
INSERT INTO `s_selected_course` VALUES ('13', '1', '4');
INSERT INTO `s_selected_course` VALUES ('14', '1', '3');
INSERT INTO `s_selected_course` VALUES ('15', '3', '1');
INSERT INTO `s_selected_course` VALUES ('16', '3', '6');
INSERT INTO `s_selected_course` VALUES ('17', '3', '5');
INSERT INTO `s_selected_course` VALUES ('18', '3', '2');
INSERT INTO `s_selected_course` VALUES ('19', '4', '1');
INSERT INTO `s_selected_course` VALUES ('20', '4', '2');

创建中间表对应的实体类

public class SelectedCourse {
	private int id; 
	private int student_id; //学生id
	private int course_id; //课程id
	//get set 方法自己补上
}	

选课界面的制作

创建 ManageSelectedCourseFrm 页面 注意创建成 JInternalFrame类型

页面制作如下:

给组件起个名字

private JTable selectedCourseListTable;
	private JComboBox searchCourseComboBox;
	private JComboBox searchStudentComboBox;
	private JComboBox editSelectedStudentComboBox;
	private JComboBox editSelectedCourseComboBox;

回到 MainFrm 添加选课管理按钮

给选择课程按钮绑定点击事件

//选课操作按钮绑定事件
		mntmNewMenuItem_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//打开选择课程页面
				openManageSelectetCourseFrm(e);
			}
		});
//打开选择课程页面
	protected void openManageSelectetCourseFrm(ActionEvent e) {
		// TODO Auto-generated method stub
		ManageSelectedCourseFrm manageSelectedCourseFrm = new ManageSelectedCourseFrm();
		manageSelectedCourseFrm.setVisible(true);
		desktopPane.add(manageSelectedCourseFrm);
	
	}

重写 Student类的toString方法,返回学生姓名

@Override
	public String toString() {
		return name;
	}

当 ManageSelectedCourseFrm 页面一打开,给学生和课程下拉框填充数据

首先在 ManageSelectedCourseFrm 的成员变量位置,定义两个集合

private List<Student> studentList = new ArrayList<Student>();  //存放学生对象的集合
private List<Course> courseList = new ArrayList<Course>(); //存放课程的集合

在 ManageSelectedCourseFrm 中提供两个方法

//给学生下拉框填充数据
	private void setStudentCombox(){
		StudentDao studentDao = new StudentDao();
		studentList = studentDao.getStudentList(new Student());
		for (Student student : studentList) {
			searchStudentComboBox.addItem(student);
			editSelectedStudentComboBox.addItem(student);
		}
	}
	//给课程下拉框填充数据
	private void setCourseCombox(){
		CourseDao courseDao = new CourseDao();
		courseList = courseDao.getCourseList(new Course());
		for (Course course : courseList) {
			searchCourseComboBox.addItem(course);
			editSelectedCourseComboBox.addItem(course);
		}
	}

在构造方法中调用 setStudentCombox() 和 setCourseCombox() 方法

setStudentCombox();
		setCourseCombox();

编写方法,获取学生已经选择的课程,显示在表格里面

首先,编写 SelectedCourseDao 提供查询所有课程的方法

public class SelectedCourseDao  {
	//查询所有选择的课程
	public List<SelectedCourse> getSelectedCourseList(SelectedCourse selectedCourse){
		List<SelectedCourse> retList = new ArrayList<SelectedCourse>();
		StringBuffer sqlString = new StringBuffer("select * from s_selected_course");
		if(selectedCourse.getStudent_id() != 0){
			sqlString.append(" and student_id = "+selectedCourse.getStudent_id());
		}
		if(selectedCourse.getCourse_id() != 0){
			sqlString.append(" and course_id ="+selectedCourse.getCourse_id());
		}
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sqlString.toString().replaceFirst("and", "where"));
			ResultSet executeQuery = preparedStatement.executeQuery();
			while(executeQuery.next()){
				SelectedCourse sc = new SelectedCourse();
				sc.setId(executeQuery.getInt("id"));
				sc.setStudent_id(executeQuery.getInt("student_id"));
				sc.setCourse_id(executeQuery.getInt("course_id"));
				retList.add(sc);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return retList;
	}
}

###

在 ManageSelectedCourseFrm 定义一个initTable()的方法

private void initTable(){
		Student student = (Student) searchStudentComboBox.getSelectedItem();
		SelectedCourse sc = new SelectedCourse();
		sc.setStudent_id(student.getId());
		//调用这个方法填充表格数据
		getSelectedCourse(sc);
	}

在 ManageSelectedCourseFrm 定义一个getSelectedCourse()的方法

//获取学生的已经选择的课程,填充表格
	private void getSelectedCourse(SelectedCourse selectedCourse){
		SelectedCourseDao selectedCourseDao = new SelectedCourseDao();
		List<SelectedCourse> selectedCourseList = selectedCourseDao.getSelectedCourseList(selectedCourse);
		DefaultTableModel dft = (DefaultTableModel) selectedCourseListTable.getModel();
		dft.setRowCount(0);
		for (SelectedCourse sc : selectedCourseList) {
			Vector v = new Vector();
			v.add(sc.getId());
			//getStudentNameById()抽取一个根据学生id返回学生姓名的方法
			v.add(getStudentNameById(sc.getStudent_id())); 
			//getCourseNameById()抽取一个根据课程id,返回课程名称的方法
			v.add(getCourseNameById(sc.getCourse_id()));
			dft.addRow(v);
		}
		
	}
	//根据学生id返回学生姓名的方法
	private String getStudentNameById(int id){
		for (int i = 0; i < studentList.size(); i++) {
			if(studentList.get(i).getId() == id){
                return studentList.get(i).getName();
            }
		}
		return "";
	}
	//根据课程id,返回课程名称的方法
	private String getCourseNameById(int id){
		for (int i = 0; i < courseList.size(); i++) {
			if(id == courseList.get(i).getId()){
                return courseList.get(i).getName();
            }
		}
		return "";
	}

在构造方法中调用 initTable() 方法

给确认选课按钮,添加事件

首先在 SelectedCourseDao 中提供一个添加选课的方法

//添加选课
	public boolean addSelectedCourse(SelectedCourse selectedCourse){
		String sql = "insert into s_selected_course values(null,?,?)";
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sql);
			preparedStatement.setInt(1, selectedCourse.getStudent_id());
			preparedStatement.setInt(2, selectedCourse.getCourse_id());
			if(preparedStatement.executeUpdate() > 0)return true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}

然后在 CourseDao.java 中 提供 一个判断的方法

//课程是否可选
	public boolean selectedEnable(int course_id) {
		String sql = "select * from s_course where id=?";
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement prst = con.prepareStatement(sql);//
			prst.setInt(1, course_id);
			ResultSet executeQuery = prst.executeQuery();
			if (executeQuery.next()) {
				int max_student_num = executeQuery.getInt("max_student_num"); //最大选课数
				int selected_num = executeQuery.getInt("selected_num"); //已经选择课数
				//如果已选课数,大于最大选课数,则不能再选了
				if (selected_num >= max_student_num) {
					return false;
				}	
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
	}

再在 CourseDao.java 中提供更新已选课程数的方法

//更新已选课程数的方法
	public boolean updateSelectedNum(int course_id, int num) {
		String sql = "update s_course set selected_num = selected_num + ? where id = ?";
		if (num < 0) {
			sql = "update s_course set selected_num = selected_num - ? where id = ?";
		}
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sql);
			preparedStatement.setInt(1, 1);
			preparedStatement.setInt(2, course_id);
			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

		}
		return false;
	}

再在 SelectedCourseDao 中提供一个判断课程是否已经选过的方法

//判断这个课程是否已经选择过了
	public boolean isSelected(SelectedCourse selectedCourse){
		String sql = "select * from s_selected_course where student_id=? and course_id = ?";
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement prst = con.prepareStatement(sql);
			prst.setInt(1, selectedCourse.getStudent_id());
			prst.setInt(2, selectedCourse.getCourse_id());
			ResultSet executeQuery = prst.executeQuery();
			if(executeQuery.next()){
				return true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}

处理确认选课操作

//确认选课,按钮,绑定的事件
		confirmSelectedButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				confirmSelectedCourse(ae);
			}
		});
// 确认选课
	protected void confirmSelectedCourse(ActionEvent ae) {
		// TODO Auto-generated method stub
		Student sstudent = (Student) searchStudentComboBox.getSelectedItem();
		Course scourse = (Course) searchCourseComboBox.getSelectedItem();
		SelectedCourse sc = new SelectedCourse();
		sc.setStudent_id(sstudent.getId());
		sc.setCourse_id(scourse.getId());
		CourseDao courseDao = new CourseDao();
		if (!courseDao.selectedEnable(scourse.getId())) {
			JOptionPane.showMessageDialog(this, "该课程已经选满,不能再选!");
			return;
		}
		SelectedCourseDao scDao = new SelectedCourseDao();
		if (scDao.isSelected(sc)) {
			JOptionPane.showMessageDialog(this, "已经选过这门课程了,不能再选!");
			return;
		}
		//选课成功
		if (scDao.addSelectedCourse(sc)) {
			//更新已选课程数
			if (courseDao.updateSelectedNum(sc.getCourse_id(), 1)) {
				JOptionPane.showMessageDialog(this, "选课成功!!");
			} else {
				JOptionPane.showMessageDialog(this, "选课成功,课程信息更新失败!");
			}
		} else {
			JOptionPane.showMessageDialog(this, "选课失败!");
		}

		// 初始化表格数据
		initTable();
	}

启动测试

给学生下拉框添加一个下拉项选择事件,当我们下拉切换选项时,查询学生已经选择的课程,展示在表格中

说明:这个 itemStateChanged 事件,当你切换下拉选择时,会触发两次,我们只要你选中后的那一次,所以我们可以判断

ie.getStateChange() == ItemEvent.SELECTED

//学生下拉框,下拉选项发生切换时,触发该事件
		searchStudentComboBox.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent ie) {
				 studentChangeAct(ie);
			}
		});
//当学生下拉框,下拉项,切换时,在表格中显示 学生的选择的课程
	protected void studentChangeAct(ItemEvent ie) {
		//判断下拉项,选中之后执行。
		if(ie.getStateChange() == ItemEvent.SELECTED){
			initTable();
		}
		//JOptionPane.showMessageDialog(this, ie.getStateChange());
	}

启动测试

给表格的每一行,添加一个点击事件,点击每一行时,回显这行数据到编辑区

//给表格的 一行添加点击事件
		selectedCourseListTable.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent me) {
				 selectedCourse(me);
			}
		});
// 点击表格的每一行,回显数据,到编辑区
	protected void selectedCourse(MouseEvent me) {
		// TODO Auto-generated method stub
		// 获取你选中的这一行的行号
		int row = selectedCourseListTable.getSelectedRow();
		// 获取这个一行的第一列
		String studentName = selectedCourseListTable.getValueAt(row, 1).toString();
		 获取这个一行的第二列
		String courseName = selectedCourseListTable.getValueAt(row, 2).toString();
		for (int i = 0; i < editSelectedStudentComboBox.getItemCount(); i++) {
			Student student = (Student) editSelectedStudentComboBox.getItemAt(i);
			if (studentName.equals(student.getName())) {
				editSelectedStudentComboBox.setSelectedIndex(i);
				break;
			}
		}
		for (int i = 0; i < editSelectedCourseComboBox.getItemCount(); i++) {
			Course course = (Course) editSelectedCourseComboBox.getItemAt(i);
			if (courseName.equals(course.getName())) {
				editSelectedCourseComboBox.setSelectedIndex(i);
				break;
			}
		}
	}

测试

给确认修改按钮,添加事件

//确认修改按钮,绑定事件
		confirmEditButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				 editSelectCourseAct(ae);
			}
		});

在 SelectedCourseDao 中提供 更新课程的方法

//更新课程,成功返回true,不成功返回false
	public boolean updateSelectedCourse(SelectedCourse selectedCourse) {
		String sql = "update s_selected_course set student_id = ?,course_id = ? where id = ?";
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sql);
			preparedStatement.setInt(1, selectedCourse.getStudent_id());
			preparedStatement.setInt(2, selectedCourse.getCourse_id());
			preparedStatement.setInt(3, selectedCourse.getId());
			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}

编写 editSelectCourseAct(ae) 方法,确认更新

//确认修改选课
	protected void editSelectCourseAct(ActionEvent ae) {
		// TODO Auto-generated method stub
		int row = selectedCourseListTable.getSelectedRow();
		if (row == -1) {
			JOptionPane.showMessageDialog(this, "请选择要修改的数据!");
			return;
		}
		int selected_id = Integer.parseInt(selectedCourseListTable.getValueAt(row, 0).toString());
		String studentName = selectedCourseListTable.getValueAt(row, 1).toString();
		String courseName = selectedCourseListTable.getValueAt(row, 2).toString();
		Student student = (Student) editSelectedStudentComboBox.getSelectedItem();
		Course course = (Course) editSelectedCourseComboBox.getSelectedItem();
		if (studentName.equals(student.getName()) && courseName.equals(course.getName())) {
			JOptionPane.showMessageDialog(this, "还未修改数据!");
			return;
		}
		CourseDao courseDao = new CourseDao();
		if (!courseDao.selectedEnable(course.getId())) {
			JOptionPane.showMessageDialog(this, "该课程已经选满,不能再选!");
			return;
		}

		SelectedCourse sc = new SelectedCourse();
		sc.setId(selected_id);
		sc.setStudent_id(student.getId());
		sc.setCourse_id(course.getId());
		SelectedCourseDao scDao = new SelectedCourseDao();
		if (scDao.isSelected(sc)) {
			JOptionPane.showMessageDialog(this, "已经选过这门课程了,不能再选!");
			return;
		}
		//课程修改成功,新的课程加1,旧的课程减去1
		if (scDao.updateSelectedCourse(sc)) {
			//新的课程+1
			if (courseDao.updateSelectedNum(sc.getCourse_id(), 1)) {
				// getCourseIdByName(courseName) 抽取一个方法, 根据课程名称返回课程id
				//旧的课程-1
				if (courseDao.updateSelectedNum(getCourseIdByName(courseName), -1)) {
					JOptionPane.showMessageDialog(this, "修改成功!!");
				}
			} else {
				JOptionPane.showMessageDialog(this, "修改成功,课程信息更新失败!");
			}
		}

		initTable();
	}

测试

自己启动测试

给退选课程按钮,添加事件

在 SelectedCourseDao 中提供删除课程的方法

//退选课程
	public boolean delete(int id) {
		String sql = "delete from s_selected_course where id=?";
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sql);
			preparedStatement.setInt(1, id);
			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}

退选课程

// 退选课程按钮 ,添加事件
		deleteCourseButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				deleteSelectedCourse(ae);
			}
		});
// 退选课程
	protected void deleteSelectedCourse(ActionEvent ae) {
		// TODO Auto-generated method stub
		int row = selectedCourseListTable.getSelectedRow();
		if (row == -1) {
			JOptionPane.showMessageDialog(this, "请选择要修改的数据!");
			return;
		}
		int selected_id = Integer.parseInt(selectedCourseListTable.getValueAt(row, 0).toString());
		String courseName = selectedCourseListTable.getValueAt(row, 2).toString();
		SelectedCourse sc = new SelectedCourse();
		sc.setId(selected_id);
		SelectedCourseDao scDao = new SelectedCourseDao();
		CourseDao courseDao = new CourseDao();
		if (scDao.delete(selected_id)) {
			if (courseDao.updateSelectedNum(getCourseIdByName(courseName), -1)) {
				JOptionPane.showMessageDialog(this, "退课成功!");
			} else {
				JOptionPane.showMessageDialog(this, "退课成功,更新课程信息失败!");
			}
		} else {
			JOptionPane.showMessageDialog(this, "退课失败!");
		}
		
		initTable();
	}

启动测试

设置角色权限

如果是学生身份登录,那么课程管理按钮禁用。

回到MainFrm 进行判断

给课程管理按钮起个名字 courseMenu

// 根据身份设置不同的权限 设置权限
	private void setAuthority() {
		if ("学生".equals(userType.getName())) {
			//设置按钮为false即为禁用
			addStudentMenuItem.setEnabled(false);
			manageClassMenu.setEnabled(false);
			manageTeacherMenu.setEnabled(false);
			//设置课程管理按钮禁用
			courseMenu.setEnabled(false);
		}
		if ("教师".equals(userType.getName())) {
			addTeacherMenuItem.setEnabled(false);
		}
	}

测试

在选课管理里面,学生只能查看自己的选课,不能查看其它学生的选课,只能修改和退选自己的课程。

在 ManageSelectedCourseFrm 中提供方法,禁用下拉框

	private void setAuthority(){
		if("学生".equals(MainFrm.userType.getName())){
			searchStudentComboBox.setEnabled(false);
			editSelectedStudentComboBox.setEnabled(false);
		}
	}

在构造方法里面调用 setAuthority() 方法

修改 setStudentCombox()方法,加上学生身份的判断

// 给学生下拉框填充数据
	private void setStudentCombox() {
		StudentDao studentDao = new StudentDao();
		studentList = studentDao.getStudentList(new Student());
		for (Student student : studentList) {
			searchStudentComboBox.addItem(student);
			editSelectedStudentComboBox.addItem(student);
		}
		if ("学生".equals(MainFrm.userType.getName())) {
			Student user = (Student) MainFrm.userObject;
			for (int i = 0; i < searchStudentComboBox.getItemCount(); i++) {
				Student student = (Student) searchStudentComboBox.getItemAt(i);
				if (student.getId() == user.getId()) {
					searchStudentComboBox.setSelectedIndex(i);
					editSelectedStudentComboBox.setSelectedIndex(i);
					break;
				}
			}
		}
	}

测试

==本节完==

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JSON百科全书:学习JSON看这一篇就够了

目录 1.1 JSON 简介 1.1.1 什么是 JSON 1.1.2 JSON 的特点 1.2 JSON 语法 1.2.1 JSON 键/值对 1.2.2 JSON 字符串 1.2.3 JSON 数值 1.2.4 JSON 对象 1.2.5 JSON 数组 1.2.6 JSON 布尔值 1.2.7 JSON null 1.2.8 JSON 文件 1.3 JSON 对象 1.3.1 访问对象的值 1.3…

7DGroup性能实施项目日记7

九月廿五 壬寅年 虎 庚戌月 丙午日 从昨天的场景执行和结果分析来看&#xff0c;效果有一些。今天我们又换了一个接口&#xff0c;看看有什么新问题。 从我的 RESAR 性能工程的逻辑上来看&#xff0c;现在是在基准场景执行的阶段。在这个阶段就是要把每个接口都单独压到最大tp…

大数据开发之Hive案例篇14:某个节点HDFS块比较多

文章目录 一. 问题描述二. 解决方案2.1 查看节点安装的组件2.2 排查HDFS配置2.3 排查Yarn配置2.3.1 首先查看下nodemanager的日志2.3.2 查看container分配情况2.3.3 查看调度机制2.3.4 查看集群任务情况2.3.5 集群负载情况2.3.6 resourcemanager与nodemanager是否可以混合部署 …

基于Springboot的在线竞拍系统(拍卖系统)

今天给大家带来了一个在线竞拍(拍卖)系统&#xff08;带设计报告&#xff09;&#xff0c;项目功能完善。 用户功能 包括沙箱支付宝支付&#xff0c;在线竞拍&#xff0c;收藏管理&#xff0c;个人资料管理&#xff0c;竞拍管理等等。 机构功能 包括&#xff0c;上传竞拍项目…

springboot球赛管理小程序

球赛管理系统 springboot球赛管理系统小程序 java球赛管理小程序 技术&#xff1a; 基于springbootvue小程序球赛管理系统的设计与实现 运行环境&#xff1a; JAVA版本&#xff1a;JDK1.8 IDE类型&#xff1a;IDEA、Eclipse都可运行 数据库类型&#xff1a;MySql&#xff08;…

优盘无法识别?恢复U盘数据就这样做!

到底是怎么回事呢&#xff1f;我的优盘用得好好的&#xff0c;突然就无法识别了。优盘里有对我很重要的数据&#xff0c;这些数据还能找回来吗&#xff1f;希望大家帮帮我&#xff01; 优盘作为常用的便携式存储设备。为我们随时随地保存数据提供了很大的便利。我们可以利用u盘…

C++并发编程之玩转condition_variable

C并发编程之玩转condition_variable 0.导语 最近在看并发编程相关的代码&#xff0c;自己顺手从0开始写了个小项目玩转并发场景下的生产消费者模型&#xff0c;如果你想提高多线程编程方面的能力&#xff0c;想熟练掌握condition_variable的使用&#xff0c;甚至想在面试当中凸…

Go 语言精进之路——Go 中常见并发模式总结

文章目录 前言创建模式退出模式分离模式join 模式notify-and-wait模式退出模式的应用 管道模式扇出与扇入模式 超时与取消模式 前言 在语言层面&#xff0c;Go针对CSP模型提供了三种并发原语。 goroutine&#xff1a;对应CSP模型中的P&#xff0c;封装了数据的处理逻辑&#x…

数字化赋能大健康实体行业迈入发展新阶段,大健康招商加盟系统优势有哪些?

数字经济的发展&#xff0c;正推动大健康实体行业迈入高质量发展新阶段。大健康实体行业应如何在数字化浪潮中抢占先机&#xff1f;大健康实体行业招商加盟平台应如何开发设计&#xff0c;才能帮助大健康企业主取得营收突破&#xff1f; 围绕蚓链大健康招商加盟系统&#xff0c…

ppt制作相关内容小结

ppt制作是天大的事&#xff01;是讲清一件事&#xff0c;表达自己的最好方式 1.删除ppt中的所有备注信息2.ppt制作中的快捷键3.精美的ppt收集 这里还是要提醒自己一下&#xff0c;做好ppt是外在的事情&#xff0c;把道理吃透才是根本&#xff01; 但是ppt外在也是表达的一种方式…

闭包实现函数柯里化,js实现

闭包实现函数柯里化&#xff0c;js实现 函数柯里化定义代码实现 函数柯里化定义 柯里化&#xff08;Currying&#xff09;是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数&#xff0c;并且返回接受余下的参数且返回结果的新函数的技术 即函数可以接…

.NET 8 Preview 4 中的 ASP.NET Core 更新

作者&#xff1a;Daniel Roth - Principal Program Manager, ASP.NET 翻译&#xff1a;Alan Wang 排版&#xff1a;Alan Wang .NET 8 Preview 4 现已可用&#xff0c;并包括了许多对 ASP.NET Core 的新改进。 以下是本预览版本中的新内容摘要&#xff1a; Blazor 使用 Blazor …

图片:前端展示图像(img 、picture、svg、canvas )及常用图片格式(PNG、JPG、JPEG、WebP、GIF、SVG、AVIF等)

一、浏览器网页展示图片方法 1.1、HTML <img> 标签 <!DOCTYPE html> <html><head><title>图片展示</title></head><body><h1>图片展示</h1><img src"example.jpg" alt"Example Image" w…

项目——学生信息管理系统3

目录 班级添加的界面实现 创建班级的实体类 在org.xingyun.dao 包下 编写 ClassDao 创建 AddStudentClassFrm 添加班级页面 注意创建成 JInternalFrame 类型 给控件起个名字 注释掉main方法 给提交按钮绑定事件 回到 MainFrm.java 给添加班级按钮绑定事件 启动测试 班…

chatgpt赋能python:Python重写父类的方法

Python重写父类的方法 在Python中&#xff0c;继承是一个常见的概念。通过继承&#xff0c;子类可以使用父类中定义的属性和方法。有时候&#xff0c;子类需要改变父类中的行为。这时候&#xff0c;可以通过重写父类的方法来实现这一目的。 什么是重写方法&#xff1f; 当一…

区块链生态发展

文章目录 前言以太坊的到来什么是图灵完备&#xff1f;什么是智能合约&#xff1f; 以太坊的应用去中心化应用 DApp代币发行 公有链&联盟链区块链应用总结 前言 前面的区块链文章有介绍区块链的诞生以及底层运行原理&#xff0c; 本文主要介绍一下区块链应用的发展&#x…

(八)灌溉系统-将nodejs部署到云服务器(未实现,思路供参考)

这里之后我就是升级优化了 如果不想再学习的话&#xff0c;前面的就足够用了 Node后端部署上线详细步骤及踩坑记录&#xff08;使用宝塔面板&#xff09;&#xff1a;参考文章 Xshelll7下载&#xff1a;教程 这里是成功连上了

如何使用 Terraform 和 Git 分支有效管理多环境?

作者&#xff5c;Sumeet Ninawe 翻译&#xff5c;Seal软件 链接&#xff5c;https://spacelift.io/blog/terraform-environments 通常我们使用 Terraform 将我们的基础设施定义为代码&#xff0c;然后用 Terraform CLI 在我们选择的云平台中创建制定的基础设施组件。从表面上看…

C++primer(第五版)第五章(语句)

5.1简单语句 一个语句在末尾加上分号;就变成了表达式语句.表达式语句的作用是执行表达式并丢弃掉求值结果(也可以用赋值运算符将求值结果存起来),不存起来的话,大多数表达式语句是没有什么实际用处的表达式语句,例如: int a10; a5; //这就是没什么用的表达式语句 ; …

《Linux操作系统编程》第四章 屏幕编程器vi : 了解屏幕编辑器vi的概述和基本操作命令

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…