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

目录

学生选课功能的介绍

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

创建实体类

创建添加课程页面 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;  //课程idprivate 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 blocke.printStackTrace();}return false;}
}   

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

addCourseButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {addCourseAct(ae);}});
//添加课程protected void addCourseAct(ActionEvent ae) {// TODO Auto-generated method stubString 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 exceptionJOptionPane.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 stubcourseNameTextField.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 blocke.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 stubManageCourseFrm 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 blocke.printStackTrace();}return false;}

//删除按钮,绑定事件deleteCourseButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {deleteCourse(ae);}});
//删除操作protected void deleteCourse(ActionEvent ae) {// TODO Auto-generated method stubint 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 stubString 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() {@Overridepublic void mouseClicked(MouseEvent me) {selectedCourse(me);}});

//点击表格每一行,回显到编辑区protected void selectedCourse(MouseEvent me) {// TODO Auto-generated method stubint row = courseListTable.getSelectedRow();String couseName = courseListTable.getValueAt(row, 1).toString();//根据教师姓名返回教师idint 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 的方法,因为上面调用了
//根据教师姓名返回idprivate 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 blocke.printStackTrace();}return false;}

	//确认修改按钮,事件submitEditButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {editCourseSubmit(ae);}});
//修改的方法protected void editCourseSubmit(ActionEvent ae) {// TODO Auto-generated method stubint 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 exceptionJOptionPane.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; //学生idprivate 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 stubManageSelectedCourseFrm manageSelectedCourseFrm = new ManageSelectedCourseFrm();manageSelectedCourseFrm.setVisible(true);desktopPane.add(manageSelectedCourseFrm);}

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

@Overridepublic 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 blocke.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 blocke.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 blocke.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 blocke.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 blocke.printStackTrace();}return false;}

处理确认选课操作

//确认选课,按钮,绑定的事件confirmSelectedButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {confirmSelectedCourse(ae);}});
// 确认选课protected void confirmSelectedCourse(ActionEvent ae) {// TODO Auto-generated method stubStudent 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() {@Overridepublic 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,不成功返回falsepublic 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 blocke.printStackTrace();}return false;}

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

//确认修改选课protected void editSelectCourseAct(ActionEvent ae) {// TODO Auto-generated method stubint 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,旧的课程减去1if (scDao.updateSelectedCourse(sc)) {//新的课程+1if (courseDao.updateSelectedNum(sc.getCourse_id(), 1)) {// getCourseIdByName(courseName) 抽取一个方法, 根据课程名称返回课程id//旧的课程-1if (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 blocke.printStackTrace();}return false;}

退选课程

// 退选课程按钮 ,添加事件deleteCourseButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {deleteSelectedCourse(ae);}});
// 退选课程protected void deleteSelectedCourse(ActionEvent ae) {// TODO Auto-generated method stubint 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.hqwc.cn/news/2087.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Solid Converter PDF v10 安装及使用教程

目录 一、软件介绍二、下载教程三、安装教程四、使用教程1.PDF转Word、Html等2.合并PDF文件 一、软件介绍 Solid Converter PDF是一套专门将PDF文件转换成Word的软件。 能够将PDF转换为Word、Excel、HTML、PowerPoint、纯文本文件从PDF文档中提取数据并以CSV等格式保存能够转…

CENTOS上的网络安全工具(二十四)Windows下的Hadoop+Spark编程环境构建

前面我们搭建了hadoop集群&#xff0c;spark集群&#xff0c;也利用容器构建了spark的编程环境。但是一般来说&#xff0c;就并行计算程序的开发&#xff0c;一刚开始一般是在单机上的&#xff0c;比如hadoop的single node。但是老师弄个容器或虚拟机用vscode远程访问式开发&am…

Android13 安装最新版 Frida

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰&#xff0c;更不会影响计算机信息系统的正常运行。不得将代码用于非法用途&#xff0c;如侵立删&#xff01; Android13 安装最新版 Frida 环境 win10Pixel4Android13Python3.9Frida1…

POI合并单元格设置单元格样式

文章目录 设置居中设置背景颜色设置边框设置字体合并单元格实际使用运行效果 设置居中 CellStyle centerStyle wb.createCellStyle();centerStyle.setAlignment(HorizontalAlignment.CENTER); // 居中centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中设…

CV什么时候能迎来ChatGPT时刻?

卷友们好&#xff0c;我是rumor。 最近看了几篇CV的工作&#xff0c;肉眼就感受到了CVer们对于大一统模型的“焦虑”。 这份焦虑让他们开始尝试统一一切&#xff0c;比如&#xff1a; 统一复杂的自动驾驶任务的优化目标[1]&#xff0c;来自今年CVPR最佳论文。统一典型的CV任务&…

机器学习——深度学习

1 感知机 y f ( ∑ i 1 n w i x i − b ) yf(\sum\limits_{i1}^{n}w_ix_i-b) yf(i1∑n​wi​xi​−b) 其中&#xff0c; f f f 常常取阶跃函数或 Sigmoid 函数。 学习规则&#xff1a; Δ w i η ( y − y ^ ) x i w i ← w i Δ w i \Delta w_i\eta(y-\hat{y})x_i\\ w_i…

【网络】网络基础

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 今天起正式开始学习网络部分的知识&#xff0c;依托的环境是Linux操作系统&#xff0c;而且是建立在前…

Java教程-Java异常传播

异常首先从调用堆栈的顶部抛出&#xff0c;如果没有被捕获&#xff0c;它会向下传递到前一个方法。如果在那里没有被捕获&#xff0c;异常会再次向下传递到前一个方法&#xff0c;依此类推&#xff0c;直到它们被捕获或者达到调用堆栈的最底部。这被称为异常传播。 异常传播示例…

git 显示不出图标

今天写完代码准备上传 gitee 的时候发现&#xff0c;自己的本地文件夹没有小绿勾了&#xff0c;整的我一时分不清到底哪些文件已经上传过。 研究了半天终于搞定了&#xff0c;现在把方法记录下来&#xff0c;防止以后继续出现这种问题还要找半天。 1. 打开注册表 win R 打开运…

JAVA选择题笔试:static成员与非static成员、父类子类方法的继承、接口与抽象类、final的使用

0、前言 本文针对一些java基础知识的一些考点做出解析。 1、静态成员 与 非静态成员 静态变量与静态方法都是静态成员。 先说静态变量与普通成员变量的区别&#xff0c;例如如下两个变量&#xff1a; public class Demo {public static String A "静态变量";publi…

draggable里包裹的卡片,卡片里有个input,点击input聚焦无效。

在input标签上加pointerdown.stop.native <el-input placeholder"请输入" pointerdown.stop.native v-model"dataForm.nickName" :style"{width:180px}" suffix-icon"el-icon-search" lazy />

HCIP-7.3QinQ技术原理、配置链路聚合Eth-Trunk

HCIP-7.3QinQ技术原理、配置&链路聚合Eth-Trunk 1、QinQ概述1.1、QinQ实现方式&#xff1a;1.2、QinQ封装结构&#xff1a;1.3、QinQ的分类&#xff1a;1.3.1、基于端口的QinQ1.3.2、灵活QinQ 2、链路聚合Eth-Trunk2.1、Eth-Trunk基本原理2.2、手工聚合模式2.2.1、配置接口…