今年夏季小学期的作业,一个星期设计出一个图书馆里系统
写的时候东拼西凑才完成,debug无数次,写的时候脑子还是有点不太清楚,今天不小心又打开了这个项目,于是乎想整理一下
题目
18 学生选课系统
假定有n门课程,每门课程有课程编号,课程名称,课程性质,学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于15)自由选课。试设计一个选修课程系统,使之能提供以下功能:
(1)系统以菜单方式工作
(2)课程信息和学生选课信息录入功能(课程信息用文件保存)
(3)课程信息浏览功能
(4)查询功能
(5)按学分查询
(6)某门课程学生选修情况(可选项)
数据库+IDEA+SenceBuilder
先上效果
登录页面:
学生操作页面:
管理员页面
设计
结构:
实体层(entity):
学生类(student.java)
管理员类(Adm.java)
课程类(curriculum.java)
控制层(controller):
LoginAction.java
AdmAction.java
StudentAction.java
视图层(view):
login.fxml
student.fxml
adm.fxml
数据库设计
数据库名:course_selection_system
adm表
curriculum表
student表
student_course表:根据学生id和课程id的一对多关系,查找该学生id下对应的所有课程id,进而再根据课程id找到唯一的课程
关系图:
三个实体类设计:
代码
数据库连接类
package cn.edu.ncu.yang.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
private static final String URL="jdbc:mysql://localhost:3306/course_selection_system?useUnicode=true&serverTimeZone=UTC";
private static final String NAME="yjz";//我的数据库用户名
private static final String PASSWORD="yjz123456";//数据库密码
private static Connection conn=null;
//静态代码块(将加载驱动、连接数据库放入静态块中)
static{
try {
//1.加载驱动程序
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获得数据库的连接
conn = DriverManager.getConnection(URL, NAME, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
//对外提供一个方法来获取数据库连接
public static Connection getConnection(){
return conn;
}
}
管理员类
package cn.edu.ncu.yang.entity;
import cn.edu.ncu.yang.db.DBUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* Adm管理员,
* 功能:查询课程,添加课程,删除课程
*/
public class Adm {
//连接数据库
private static Connection con= DBUtil.getConnection();
//管理员id
private String id;
//管理员密码
private String password;
//创建一个课程类,方便后面操作
private List<Curriculum> courses=new ArrayList<>();
public Adm(String id, String password) {
this.id = id;
this.password = password;
}
/**
* 注册
* @param id 账号
* @param password 密码
* @return
*/
public static Adm Register(String id,String password){
try {
String sql2="insert into adm(id,password) values('"+id+"','"+password+"')";
PreparedStatement psmt=DBUtil.getConnection().prepareCall(sql2);
psmt.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return new Adm(id,password);
}
/**
* 登录
* @param id 账号
* @param password 密码
* @return
*/
public static Adm Login(String id,String password){
String sql="select * from student where student_id ='"+id+"'"+"and student_password='"+password+"'";
try {
Statement statement = DBUtil.getConnection().createStatement();
ResultSet rs = statement.executeQuery(sql);
if (!rs.next()) {
return Register(id,password);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return new Adm(id,password);
}
/**
* 得到所有课程信息
* @return
*/
public List<Curriculum> getCourses(){
try{
Statement statement = con.createStatement(); //2.创建statement类对象,用来执行SQL语句!!
String sql = "SELECT * FROM curriculum ";//要执行的SQL语句
ResultSet rs = statement.executeQuery(String.format(sql));
while (rs.next()) {
courses.add(Curriculum.getACurriculum(rs));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return courses;
}
/**
* 添加课程
* @param course
*/
public void addCourse(Curriculum course){
try {
String sql2="insert into curriculum(course_id,teacher_name,course_name,class_hours,course_nature,opening_semester,student_number) values('"
+course.getId()+
"','"+course.getTeacherName()+
"','"+course.getName()+
"','"+course.getClassHours()+
"','"+course.getNature()+
"','"+course.getOpeningSemester()+
"','"+course.getStudentNumber()+"')";
PreparedStatement psmt=DBUtil.getConnection().prepareCall(sql2);
psmt.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
/**
* 删除课程
* @param courseId
*/
public boolean delCourse(String courseId){
try{
var sql = "delete from curriculum where course_id=’%s‘";
PreparedStatement psmt = con.prepareStatement(String.format(sql, courseId));
//执行SQL语句
psmt.executeUpdate(String.format(sql, courseId));
} catch (SQLException throwables) {
throwables.printStackTrace();
return false;
}
return true;
}
public void setCourses(java.util.List<Curriculum> courses) {
this.courses = courses;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
学生类
package cn.edu.ncu.yang.entity;
import cn.edu.ncu.yang.db.DBUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* 学生类
* 学号:id
* 登录密码:password
* 姓名:name
* 班级:grade
* 课程数:courseNumber
* 总学分:totalCredit
*
*功能:添加课程,查询课程,删除课程,查看(修改个人信息)
*
*
*
*/
public class Student {
private static Connection con=DBUtil.getConnection();
private String id;
private String password;
private String name;
private String grade;
private int courseNumber;
private double totalCredit;
private List<Curriculum> curriculumList;
public Student() {
}
public Student(String id,String password){
this.id=id;
this.password=password;
}
public Student(String id, String password, String name, String grade, int courseNumber, double totalCredit) {
this.id = id;
this.password = password;
this.name = name;
this.grade = grade;
this.courseNumber = courseNumber;
this.totalCredit = totalCredit;
}
/**
* 登录
* @param id
* @param password
* @return
*/
public static Student Login(String id,String password) {
String sql="select * from student where student_id ='"+id+"'"+"and student_password='"+password+"'";
try {
Statement statement = DBUtil.getConnection().createStatement();
ResultSet rs = statement.executeQuery(sql);
if (rs.next()) {
return getAStudent(rs);
}
else{
return Register(id,password);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
/**
* 注册
* @param id
* @param password
* @return
*/
public static Student Register(String id,String password){
String sql="select * from student where student_id ='"+id+"'"+"and student_password='"+password+"'";
try {
String sql2="insert into student(student_id,student_password) values('"+id+"','"+password+"')";
PreparedStatement psmt=DBUtil.getConnection().prepareCall(sql2);
psmt.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return Login(id,password);
}
/**
* 判断课程是否已选
* @param course
* @return
*/
public Boolean isCourseSelected(Curriculum course){
String sql="select * from student_course where student_id =%s and course_id=%s";
try {
Statement statement = DBUtil.getConnection().createStatement();
ResultSet rs = statement.executeQuery(String.format(sql,getId(),course.getId()));
if (rs.next()) {
System.out.println(course.getName()+":该课程已经被选");
return true;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return false;
}
/**
* 判断课程人数是否已满
* @param course
* @return
*/
public boolean isFullPerson(Curriculum course){
String sql="select * from curriculum where course_id='"+course.getId()+"'";
try {
Statement statement = DBUtil.getConnection().createStatement();
ResultSet rs = statement.executeQuery(sql);
if (rs.next()) {
System.out.println("学生人数:"+Curriculum.getACurriculum(rs).getStudentNumber());//debug
return Curriculum.getACurriculum(rs).getStudentNumber()>=30;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return false;
}
/**
* 判断课程是否存在
* @param course
* @return
*/
public boolean isCourseExistence(Curriculum course){
String sql="select * from curriculum where course_id=%s";
try {
Statement statement = DBUtil.getConnection().createStatement();
ResultSet rs = statement.executeQuery(String.format(sql,course.getId()));
if (rs.next()) {
System.out.println("course"+course.getName()+"存在");//debug
return true;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return false;
}
/**
* 添加课程
* @param course
* @return
*/
public boolean addCourse(Curriculum course){
if(!isCourseSelected(course)&&!isFullPerson(course)&&isCourseExistence(course)) {
addTotalCredit(course);
addCourseNumber(course);
addStudentToCourseId(getId(), course.getId());
return true;
}
return false;
}
/**
* 删除课程
* @param course
* @return
*/
public boolean delCourse(Curriculum course){
if(isCourseSelected(course)){
delCourseNumber(course);
delTotalCredit(course);
delStudentToCourseId(getId(),course.getId());
return true;
}
return false;
}
/**
* 学生增加课程时,添加对应的student_course
* @param studentID
* @param courseID
*/
public void addStudentToCourseId(String studentID,String courseID){
try{
String sql = "insert into student_course(student_id,course_id) values(%s,%s)";
System.out.println("插入学生id:"+studentID);
PreparedStatement psmt = con.prepareStatement(String.format(sql, studentID, courseID));
//执行SQL语句
psmt.executeUpdate(String.format(sql, studentID, courseID));
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
/**
* 学生删除课程时
* 删掉对应的student_course表中的信息
* @param studentID
* @param courseID
*/
public void delStudentToCourseId(String studentID,String courseID){
// try{
// String sql = "insert into student_course(student_id,course_id) values(" + studentID + "," + courseID + ")";
// PreparedStatement psmt = DBUtil.getConnection().prepareCall(sql);
// psmt.execute();
// } catch (SQLException throwables) {
// throwables.printStackTrace();
// }
try{
var sql = "delete from student_course where student_id=%s and course_id=%s";
PreparedStatement psmt = con.prepareStatement(String.format(sql, studentID, courseID));
//执行SQL语句
psmt.executeUpdate(String.format(sql, studentID, courseID));
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
/**
* 添加课程时,对应的课程数加一
* @param course
*/
public void addCourseNumber(Curriculum course){
try{
Statement statement = con.createStatement(); //2.创建statement类对象,用来执行SQL语句!!
String sql1 = "UPDATE curriculum SET student_number='" + (course.getStudentNumber()+ 1)+
"' WHERE course_id='" + course.getId() + "'";//要执行的SQL语句
statement.executeUpdate(String.format(sql1));
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
/**
* 学生删除课程时,课程人数减一
* @param course
*/
public void delCourseNumber(Curriculum course){
try{
Statement statement = con.createStatement(); //2.创建statement类对象,用来执行SQL语句!!
String sql1 = "UPDATE curriculum SET student_number='" + (course.getStudentNumber()-1)+
"' WHERE course_id='" + course.getId() + "'";//要执行的SQL语句
statement.executeUpdate(String.format(sql1));
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
/**
* 添加课程时增加相应的学分
* @param course
*/
public void addTotalCredit(Curriculum course){
try{
Statement statement = con.createStatement();
String sql = "update student set total_credit='" + (getTotalCredit() + course.getCredit()) + "' where student_id='" + getId() + "'";
statement.executeUpdate(String.format(sql));
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
/**
* 删除课程时减去相应的学分
* @param course
*/
public void delTotalCredit(Curriculum course){
try{
Statement statement = con.createStatement();
String sql = "update student set total_credit='" + (getTotalCredit() - course.getCredit()) + "' where student_id='" + getId() + "'";
statement.executeUpdate(String.format(sql));
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
/**
* 得到自己的所有的课程信息
* @return
*/
public List<Curriculum> getAllMyCourse(){
List<Curriculum> courses= new ArrayList<>();
// String sql="select course_id from student_course where student_id='"+getId()+"'";
// String sql2="SELECT * from curriculum as c " +
// "RIGHT JOIN student_course as s " +
// "ON "+"c.student_id="+getId()+ "and c.course_id=s.course_id";
String sql1="SELECT * from curriculum as c inner JOIN student_course as s ON s.student_id="+getId()+" and s.course_id=c.course_id";
try {
Statement statement = DBUtil.getConnection().createStatement();
ResultSet rs = statement.executeQuery(String.format(sql1));
while (rs.next()) {
courses.add(Curriculum.getACurriculum(rs));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return courses;
}
/**
* 得到一个学生的全部信息
* @param rs
* @return
*/
public static Student getAStudent(ResultSet rs) {
Student student=new Student();
try{
student.setId(rs.getString("student_id"));
student.setName(rs.getString("student_name"));
student.setPassword(rs.getString("student_password"));
student.setGrade(rs.getString("student_grade"));
student.setCourseNumber(rs.getInt("course_number"));
student.setTotalCredit(rs.getDouble("total_credit"));
}catch (SQLException throwables) {
throwables.printStackTrace();
}
return student;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public int getCourseNumber() {
return courseNumber;
}
public void setCourseNumber(int courseNumber) {
this.courseNumber = courseNumber;
}
public double getTotalCredit() {
return totalCredit;
}
public void setTotalCredit(double totalCredit) {
this.totalCredit = totalCredit;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", password='" + password + '\'' +
", name='" + name + '\'' +
", grade='" + grade + '\'' +
", courseNumber=" + courseNumber +
", totalCredit=" + totalCredit +
", curriculumList=" + curriculumList +
'}';
}
}
Curriculum
package cn.edu.ncu.yang.entity;
import cn.edu.ncu.yang.db.DBUtil;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
/**
* 要求:
* 课程类:
* 假定有n门课程,每门课程有
* 课程编号 id
* 课程名称,name
* 课程性质,必修/选修 obligatory/optional
* 学时,授课学时,实验或上机学时, teaching_hours/experimental_hours
* 学分,credit
* 开课学期 opening_semester
* 等信息
*/
public class Curriculum {
//创建数据库连接
private static Connection con=DBUtil.getConnection();
//课程id
private String id;
//课程名
private String name;
//课程性质
private String nature;
//学时
private int classHours;
//学分
private double credit;
//开课学期
private String openingSemester;
//学生人数
private int studentNumber;
//任课老师
private String teacherName;
public Curriculum() {
}
public Curriculum(String id) {
this.id = id;
}
public Curriculum(String id, String name, String nature, int classHours, double credit, String openingSemester, String teacherName) {
this.id = id;
this.name = name;
this.nature = nature;
this.classHours = classHours;
this.credit = credit;
this.openingSemester = openingSemester;
this.studentNumber=0;
this.teacherName=teacherName;
}
/**
* 查找课程
* @param info
* @return
*/
public static Curriculum findCourse(String info){
Curriculum course= new Curriculum();
course=findCourseByID(info);
if(course==null){
course=findCourseByTeacherName(info);
if(course==null){
course=findCourseByCourseName(info);
if(course==null){
course=findCourseByCourseCredit(info);
if(course==null){
course=findCourseByCourseNature(info);
}
}
}
}
return course;
}
/**
* 查找符合信息的所有课程
* @param info
* @return
*/
public static List<Curriculum> findCourses(String info){
List<Curriculum> courses=new ArrayList<>();
if((findCourseByID(info))!=null)courses.add(findCourseByID(info));
if(findCourseByCourseName(info)!=null)courses.add(findCourseByCourseName(info));
if(findCourseByTeacherName(info)!=null)courses.add(findCourseByTeacherName(info));
if(findCourseByCourseCredit(info)!=null)courses.add(findCourseByCourseCredit(info));
if(findCourseByCourseNature(info)!=null)courses.add(findCourseByCourseNature(info));
return courses;
}
/**
* 查找课程通过课程编号
* @param id
* @return
*/
public static Curriculum findCourseByID(String id){
String sql="select * from curriculum where course_id='"+id+"'";//课程id
try {
Statement stmt= con.createStatement();
ResultSet rsId=stmt.executeQuery(String.format(sql));
if(rsId.next()) {
System.out.println("找到了课程:"+id);
return getACurriculum(rsId);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
/**
* 根据courseName查找课程
* @param courseName
* @return
*/
public static Curriculum findCourseByCourseName(String courseName) {
String sqlID = "select * from curriculum where course_name='" + courseName + "'";//课程id
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(String.format(sqlID));
if (rs.next()) {
System.out.println("找到了课程:"+courseName);
return getACurriculum(rs);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
/**
* 根据teacherName查找
* @param teacherName
* @return
*/
public static Curriculum findCourseByTeacherName(String teacherName) {
String sql="select * from curriculum where teacher_name='"+teacherName+"'";//授课老师
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(String.format(sql));
if (rs.next()) {
return getACurriculum(rs);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
public static Curriculum findCourseByCourseCredit(String courseCredit) {
String sql="select * from curriculum where course_credit='"+courseCredit+"'";//课程学分
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(String.format(sql));
if (rs.next()) {
return getACurriculum(rs);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
public static Curriculum findCourseByCourseNature(String courseNature) {
String sql="select * from curriculum where course_nature='"+courseNature+"'";//课程性质
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(String.format(sql));
if (rs.next()) {
System.out.println("找到了课程:"+courseNature);
return getACurriculum(rs);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
/**
* 查找所有课程
* @return
*/
public static List<Curriculum> getAllCourse(){
List<Curriculum> courses = new ArrayList<>();
String sql="select * from curriculum";
try {
Statement statement = con.createStatement();
ResultSet rs = statement.executeQuery(String.format(sql));
System.out.println("okgetAllCourse");
System.out.println(courses==null);
// System.out.println(rs.next());
while (rs.next()) {
//用来测试是否执行到这里了
System.out.println((courses.add(Curriculum.getACurriculum(rs))));
// System.out.println("ok2");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
System.out.println(courses.isEmpty());
return courses;
}
//根据找到的ResultSet封装成课程
public static Curriculum getACurriculum(ResultSet rs) {
Curriculum course= new Curriculum();
try{
course.setId(rs.getString("course_id"));
course.setName(rs.getString("course_name"));
course.setNature(rs.getString("course_nature"));
course.setClassHours(rs.getInt("class_hours"));
course.setCredit(rs.getDouble("course_credit"));
course.setTeacherName(rs.getString("teacher_name"));
course.setOpeningSemester(rs.getString("opening_semester"));
course.setStudentNumber(rs.getInt("student_number"));
System.out.println("ok");
}catch (SQLException throwables) {
throwables.printStackTrace();
}
System.out.println(course.toString());
return course;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNature() {
return nature;
}
public void setNature(String nature) {
this.nature = nature;
}
public int getClassHours() {
return classHours;
}
public void setClassHours(int classHours) {
this.classHours = classHours;
}
public double getCredit() {
return credit;
}
public void setCredit(double credit) {
this.credit = credit;
}
public String getOpeningSemester() {
return openingSemester;
}
public void setOpeningSemester(String openingSemester) {
this.openingSemester = openingSemester;
}
public int getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(int studentNUmber) {
this.studentNumber = studentNUmber;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
@Override
public String toString() {
return "Curriculum{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", nature='" + nature + '\'' +
", classHours=" + classHours +
", credit=" + credit +
", openingSemester='" + openingSemester + '\'' +
", studentNumber=" + studentNumber +
", teacherName='" + teacherName + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Curriculum that = (Curriculum) o;
return id.equals(that.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
AdmAction
package cn.edu.ncu.yang.controller;
import cn.edu.ncu.yang.db.DBUtil;
import cn.edu.ncu.yang.entity.Adm;
import cn.edu.ncu.yang.entity.Curriculum;
import cn.edu.ncu.yang.entity.Student;
import cn.edu.ncu.yang.view.LoginAction;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
public class AdmAction {
@FXML
private TableView tableView;
@FXML
private TableColumn courseId;
@FXML
private TableColumn courseTeacher;
@FXML
private TableColumn courseCredit;
@FXML
private TableColumn classNumber;
@FXML
private TableColumn classHours;
@FXML
private TableColumn openingTerm;
@FXML
private TableColumn courseName;
@FXML
private TableColumn courseNature;
@FXML
private TextField idTxt;
@FXML
private TextField hoursTxt;
@FXML
private TextField teacherTxt;
@FXML
private TextField creditTxt;
@FXML
private TextField termTxt;
@FXML
private TextField natureTxt;
@FXML
private TextField nameTxt;
@FXML
private TextField delTxt;
private Adm adm ;
public void initialAdm(){
adm=LoginAction.adm;
}
/**
* 显示所有课程
*/
@FXML
public void showAllCourse(){
ObservableList<Curriculum> list = FXCollections.observableArrayList();
List<Curriculum> allCourses=Curriculum.getAllCourse();
showCourses(list, allCourses);
}
public void showCourses(ObservableList<Curriculum> list, List<Curriculum> courses){
//每次显示清空一次列表
list.clear();
for (Curriculum course : courses) {
list.add(course); //list添加值对象
}
courseId.setCellValueFactory(new PropertyValueFactory("id"));
courseTeacher.setCellValueFactory(new PropertyValueFactory("teacherName"));
classHours.setCellValueFactory(new PropertyValueFactory("classHours"));
courseNature.setCellValueFactory(new PropertyValueFactory("nature"));
courseCredit.setCellValueFactory(new PropertyValueFactory("credit"));
openingTerm.setCellValueFactory(new PropertyValueFactory("openingSemester"));
classNumber.setCellValueFactory(new PropertyValueFactory("studentNumber"));
courseName.setCellValueFactory(new PropertyValueFactory("name"));
tableView.setItems(list);
}
/**
* 添加课程
*/
@FXML
public void addCourse(){
initialAdm();
String id=idTxt.getText();
String hours=hoursTxt.getText();
String teacher = teacherTxt.getText();
String credit = creditTxt.getText();
String term = termTxt.getText();
String nature = natureTxt.getText();
String name=nameTxt.getText();
System.out.println(Integer.parseInt(hours));
adm.addCourse(new Curriculum(id,name,nature,Integer.parseInt(hours),Double.parseDouble(credit),term,teacher));
showMessage("添加课程成功");
}
/**
* 删除课程
*/
@FXML
public void delCourse(){
initialAdm();
String id=delTxt.getText();
// Curriculum course=Curriculum.findCourse(String.format(id));
// System.out.println(course==null);
if(!adm.delCourse(id)){
showMessage("删除失败");
}
showMessage("删除成功");
}
public void showMessage(String info){
Alert alert= new Alert(Alert.AlertType.INFORMATION);
alert.setContentText(info);
alert.showAndWait();
}
}
==StudentAction ==
package cn.edu.ncu.yang.controller;
import cn.edu.ncu.yang.db.DBUtil;
import cn.edu.ncu.yang.entity.Curriculum;
import cn.edu.ncu.yang.entity.Student;
import cn.edu.ncu.yang.view.LoginAction;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**\
* 查看所有课程
* 查看我的课程
* 查询课程
* 添加课程
* 删除课程
* 查看我的信息
*/
public class StudentAction {
@FXML
private TextField infoTxt;
private Button button1;
private Button button2;
@FXML
private TableColumn<Curriculum,String> course_id;
@FXML
private TableColumn<Curriculum,String> course_teacher;
@FXML
private TableColumn<Curriculum,Integer> class_hours;
@FXML
private TableColumn<Curriculum,String> course_nature;
@FXML
private TableColumn<Curriculum,Double> course_credit;
@FXML
private TableColumn<Curriculum,String> opening_term;
@FXML
private TableColumn<Curriculum,Integer> student_number;
@FXML
private TableColumn<Curriculum,String> course_name;
@FXML
private TableColumn<Curriculum,String> add;
@FXML
private TableColumn<Curriculum,String> del;
@FXML
private TextField id_m;
@FXML
private TextField name_m;
@FXML
private TextField garde_m;
@FXML
private TextField credit_m;
@FXML
private TextField number_m;
@FXML
private TableView tableView;
private Student stu;
public void initialStudent(){
String sql ="select * from student where student_id=%s";
try {
Statement statement = DBUtil.getConnection().createStatement();
ResultSet rs = statement.executeQuery(String.format(sql,LoginAction.student.getId()));
if (rs.next()) {
stu=Student.getAStudent(rs);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
/**
* 显示所有课程
*/
@FXML
public void showAllCourse(){
initialStudent();
List<Curriculum> allCourses=Curriculum.getAllCourse();
show(allCourses);
// ObservableList<Curriculum> list = FXCollections.observableArrayList();
// showCourses(list, allCourses);
}
/**
* 显示我的课程
*/
@FXML
public void showMyCourse(){
initialStudent();
List<Curriculum> allCourses=stu.getAllMyCourse();
show(allCourses);
// ObservableList<Curriculum> list = FXCollections.observableArrayList();
// showCourses(list, allCourses);
}
/**
* 添加课程
*/
public void addCourse(Curriculum course){
initialStudent();
if(stu.addCourse(course)) {
showMessage("选课成功");
}
else{
showMessage("选课失败");
}
if(!isCreditEnough()){
showMessage("总学分未修满15分!");
}
}
/**
* 退课
*/
public void delCourse(Curriculum course){
initialStudent();
if(stu.delCourse(course)) {
showMessage("退课成功");
}
else{
showMessage("退课失败");
}
if(!isCreditEnough()){
showMessage("目前修读总学分为:"+stu.getTotalCredit()+",总学分未修满15分!");
}
}
@FXML
public void findCourses(){
String info =infoTxt.getText();
initialStudent();
List<Curriculum> allCourses=Curriculum.findCourses(info);
show(allCourses);
//
// ObservableList<Curriculum> list = FXCollections.observableArrayList();
// showCourses(list, allCourses);
}
@FXML
public void editInfo(){
garde_m.setEditable(true);
number_m.setEditable(true);
}
/**
* 修改班级,姓名
*/
@FXML
public void confirmInfo(){
initialStudent();
String garde=garde_m.getText();
String name=name_m.getText();
String sql="update student set student_name='%s',student_grade='%s' where student_id='%s'";
try{
Statement statement = DBUtil.getConnection().createStatement(); //2.创建statement类对象,用来执行SQL语句!!
statement.executeUpdate(String.format(sql,name,garde,stu.getId()));
} catch (SQLException throwables) {
throwables.printStackTrace();
showMessage("修改失败");
}
showMessage("修改成功");
garde_m.setEditable(false);
name_m.setEditable(false);
}
@FXML
public void showMyInfo(){
initialStudent();
garde_m.setText(stu.getGrade());
name_m.setText(stu.getName());
id_m.setText(stu.getId());
number_m.setText(Integer.toString(stu.getCourseNumber()));
credit_m.setText(Double.toString(stu.getTotalCredit()));
}
public void showCourses(ObservableList<Curriculum> list,List<Curriculum> courses){
//每次显示清空一次列表
list.clear();
for (Curriculum course : courses) {
list.add(course); //list添加值对象
}
course_id.setCellValueFactory(new PropertyValueFactory("id"));
course_teacher.setCellValueFactory(new PropertyValueFactory("teacherName"));
class_hours.setCellValueFactory(new PropertyValueFactory("classHours"));
course_nature.setCellValueFactory(new PropertyValueFactory("nature"));
course_credit.setCellValueFactory(new PropertyValueFactory("credit"));
opening_term.setCellValueFactory(new PropertyValueFactory("openingSemester"));
student_number.setCellValueFactory(new PropertyValueFactory("studentNumber"));
course_name.setCellValueFactory(new PropertyValueFactory("name"));
tableView.setItems(list);
}
public boolean isCreditEnough(){
return stu.getTotalCredit()>=15;
}
public void showMessage(String info){
Alert alert= new Alert(Alert.AlertType.INFORMATION);
alert.setContentText(info);
alert.showAndWait();
}
public void show( List<Curriculum> courses){
ObservableList<Curriculum> list = FXCollections.observableArrayList();
//每次显示清空一次列表
list.clear();
for (Curriculum course : courses) {
list.add(course); //list添加值对象
}
course_id.setCellValueFactory(new PropertyValueFactory("id"));
course_teacher.setCellValueFactory(new PropertyValueFactory("teacherName"));
class_hours.setCellValueFactory(new PropertyValueFactory("classHours"));
course_nature.setCellValueFactory(new PropertyValueFactory("nature"));
course_credit.setCellValueFactory(new PropertyValueFactory("credit"));
opening_term.setCellValueFactory(new PropertyValueFactory("openingSemester"));
student_number.setCellValueFactory(new PropertyValueFactory("studentNumber"));
course_name.setCellValueFactory(new PropertyValueFactory("name"));
//添加按钮进列表
add.setCellFactory((col)->{
//UserLoad换成你自己的实体名称
TableCell<Curriculum, String> cell = new TableCell<Curriculum, String>(){
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
button1 = new Button("选课");
button1.setStyle("-fx-background-color: #00bcff;-fx-text-fill: #ffffff");
button1.setOnMouseClicked((col) -> {
//获取list列表中的位置,进而获取列表对应的信息数据
Curriculum course1 = list.get(getIndex());
//按钮事件自己添加
addCourse(course1);
});
if (empty) {
//如果此列为空默认不添加元素
setText(null);
setGraphic(null);
} else {
this.setGraphic(button1);
}
}
};
return cell;
}
);
del.setCellFactory((col)->{
TableCell<Curriculum, String> cell = new TableCell<Curriculum, String>(){
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
//按钮显示文字
button2 = new Button("退课");
//设置按钮颜色
button2.setStyle("-fx-background-color: #00bcff;-fx-text-fill: #ffffff");
//按钮点击事件
button2.setOnMouseClicked((col) -> {
//获取list列表中的位置,进而获取列表对应的信息数据
Curriculum course2 = list.get(getIndex());
//按钮事件自己添加
delCourse(course2);
});
if (empty) {
//如果此列为空默认不添加元素
setText(null);
setGraphic(null);
} else {
//加载按钮
this.setGraphic(button2);
}
}
};
return cell;
}
);
tableView.setItems(list);
}
}
==App==
```java
package cn.edu.ncu.yang.view;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
AnchorPane root = FXMLLoader.load(getClass().getResource("login.fxml"));
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.setTitle("登录");
primaryStage.show();
}
}
LoginAction
package cn.edu.ncu.yang.view;
import cn.edu.ncu.yang.entity.Adm;
import cn.edu.ncu.yang.entity.Student;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import java.io.IOException;
public class LoginAction {
public static Adm adm=null;
public static Student student=null;
@FXML
private TextField idTxt;
@FXML
private PasswordField passwordTxt;
@FXML
private Button login_registerBt;
@FXML
private ToggleGroup selectID;
@FXML
private RadioButton stuRB;
@FXML
private RadioButton admRB;
private Student stu;
private String sql_id="select * from curriculum where course_id='id'";
@FXML
public void Login() throws IOException {
var id=idTxt.getText();
var password=passwordTxt.getText();
if(stuRB.isSelected()){
studentLogin(id,password);
AnchorPane root = FXMLLoader.load(getClass().getResource("student.fxml"));
var scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
stage.setTitle("学生登录");
stage.show();
}
else if(admRB.isSelected()){
admLogin(id, password);
AnchorPane root = FXMLLoader.load(getClass().getResource("adm.fxml"));
var scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
stage.setTitle("管理员登录");
stage.show();
}
}
public boolean studentLogin(String id,String password){
this.student=Student.Login(id,password);
return this.student!=null;
}
public boolean admLogin(String id,String password){
this.adm=Adm.Login(id,password);
return this.adm!=null;
}
}
fxml文件
fxml文件用scene builder拖拽生成 yyds
login.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="433.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cn.edu.ncu.yang.controller.AdmAction">
<children>
<ImageView fitHeight="645.0" fitWidth="671.0" layoutX="4.0" layoutY="47.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@images/桌面.jpg" />
</image>
</ImageView>
<TabPane layoutX="10.0" layoutY="17.0" prefHeight="425.0" prefWidth="640.0" tabClosingPolicy="UNAVAILABLE">
<tabs>
<Tab text="查看全部课程">
<content>
<TableView fx:id="tableView" prefHeight="376.0" prefWidth="644.0">
<columns>
<TableColumn fx:id="courseId" prefWidth="75.0" text="课程编号" />
<TableColumn fx:id="courseName" prefWidth="75.0" text="课程名" />
<TableColumn fx:id="courseTeacher" prefWidth="75.0" text="授课老师" />
<TableColumn fx:id="courseCredit" prefWidth="75.0" text="课程学分" />
<TableColumn fx:id="classHours" prefWidth="75.0" text="学时" />
<TableColumn fx:id="openingTerm" prefWidth="75.0" text="开课学期" />
<TableColumn fx:id="courseNature" prefWidth="75.0" text="课程性质" />
<TableColumn fx:id="classNumber" prefWidth="65.99993896484375" text="课程人数" />
<TableColumn prefWidth="49.3333740234375">
<graphic>
<Button mnemonicParsing="false" onAction="#showAllCourse" text="刷新" />
</graphic>
</TableColumn>
</columns>
</TableView>
</content>
</Tab>
<Tab text="添加课程">
<content>
<Pane prefHeight="200.0" prefWidth="200.0">
<children>
<Label layoutX="71.0" layoutY="48.0" text="课程编号:">
<font>
<Font size="16.0" />
</font>
</Label>
<Label layoutX="71.0" layoutY="83.0" text="授课老师:">
<font>
<Font size="16.0" />
</font>
</Label>
<Label layoutX="103.0" layoutY="124.0" text="学时:">
<font>
<Font size="16.0" />
</font>
</Label>
<Label layoutX="103.0" layoutY="159.0" text="学分:">
<font>
<Font size="16.0" />
</font>
</Label>
<Label layoutX="71.0" layoutY="198.0" prefHeight="22.0" prefWidth="80.0" text="开课学期:">
<font>
<Font size="16.0" />
</font>
</Label>
<Label layoutX="63.0" layoutY="238.0" text="课程性质:">
<font>
<Font size="16.0" />
</font>
</Label>
<TextField fx:id="idTxt" layoutX="175.0" layoutY="47.0" />
<TextField fx:id="teacherTxt" layoutX="175.0" layoutY="83.0" />
<TextField fx:id="hoursTxt" layoutX="175.0" layoutY="124.0" />
<TextField fx:id="creditTxt" layoutX="175.0" layoutY="159.0" />
<TextField fx:id="termTxt" layoutX="175.0" layoutY="198.0" />
<TextField fx:id="natureTxt" layoutX="175.0" layoutY="237.0" />
<Button layoutX="185.0" layoutY="321.0" mnemonicParsing="false" onAction="#addCourse" text="添加课程">
<font>
<Font size="16.0" />
</font>
</Button>
<TextField fx:id="nameTxt" layoutX="175.0" layoutY="277.0" />
<Label layoutX="79.0" layoutY="277.0" text="课程名:">
<font>
<Font size="16.0" />
</font>
</Label>
</children>
</Pane>
</content>
</Tab>
<Tab text="删除课程">
<content>
<Pane prefHeight="200.0" prefWidth="200.0">
<children>
<Button layoutX="434.0" layoutY="50.0" mnemonicParsing="false" onAction="#delCourse" text="删除" />
<Label layoutX="35.0" layoutY="50.0" text="输入课程编号:">
<font>
<Font size="16.0" />
</font>
</Label>
<TextField fx:id="delTxt" layoutX="159.0" layoutY="49.0" />
</children>
</Pane>
</content>
</Tab>
</tabs>
</TabPane>
</children>
</AnchorPane>
adm.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="433.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cn.edu.ncu.yang.controller.AdmAction">
<children>
<ImageView fitHeight="645.0" fitWidth="671.0" layoutX="4.0" layoutY="47.0" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@images/桌面.jpg" />
</image>
</ImageView>
<TabPane layoutX="10.0" layoutY="17.0" prefHeight="425.0" prefWidth="640.0" tabClosingPolicy="UNAVAILABLE">
<tabs>
<Tab text="查看全部课程">
<content>
<TableView fx:id="tableView" prefHeight="376.0" prefWidth="644.0">
<columns>
<TableColumn fx:id="courseId" prefWidth="75.0" text="课程编号" />
<TableColumn fx:id="courseName" prefWidth="75.0" text="课程名" />
<TableColumn fx:id="courseTeacher" prefWidth="75.0" text="授课老师" />
<TableColumn fx:id="courseCredit" prefWidth="75.0" text="课程学分" />
<TableColumn fx:id="classHours" prefWidth="75.0" text="学时" />
<TableColumn fx:id="openingTerm" prefWidth="75.0" text="开课学期" />
<TableColumn fx:id="courseNature" prefWidth="75.0" text="课程性质" />
<TableColumn fx:id="classNumber" prefWidth="65.99993896484375" text="课程人数" />
<TableColumn prefWidth="49.3333740234375">
<graphic>
<Button mnemonicParsing="false" onAction="#showAllCourse" text="刷新" />
</graphic>
</TableColumn>
</columns>
</TableView>
</content>
</Tab>
<Tab text="添加课程">
<content>
<Pane prefHeight="200.0" prefWidth="200.0">
<children>
<Label layoutX="71.0" layoutY="48.0" text="课程编号:">
<font>
<Font size="16.0" />
</font>
</Label>
<Label layoutX="71.0" layoutY="83.0" text="授课老师:">
<font>
<Font size="16.0" />
</font>
</Label>
<Label layoutX="103.0" layoutY="124.0" text="学时:">
<font>
<Font size="16.0" />
</font>
</Label>
<Label layoutX="103.0" layoutY="159.0" text="学分:">
<font>
<Font size="16.0" />
</font>
</Label>
<Label layoutX="71.0" layoutY="198.0" prefHeight="22.0" prefWidth="80.0" text="开课学期:">
<font>
<Font size="16.0" />
</font>
</Label>
<Label layoutX="63.0" layoutY="238.0" text="课程性质:">
<font>
<Font size="16.0" />
</font>
</Label>
<TextField fx:id="idTxt" layoutX="175.0" layoutY="47.0" />
<TextField fx:id="teacherTxt" layoutX="175.0" layoutY="83.0" />
<TextField fx:id="hoursTxt" layoutX="175.0" layoutY="124.0" />
<TextField fx:id="creditTxt" layoutX="175.0" layoutY="159.0" />
<TextField fx:id="termTxt" layoutX="175.0" layoutY="198.0" />
<TextField fx:id="natureTxt" layoutX="175.0" layoutY="237.0" />
<Button layoutX="185.0" layoutY="321.0" mnemonicParsing="false" onAction="#addCourse" text="添加课程">
<font>
<Font size="16.0" />
</font>
</Button>
<TextField fx:id="nameTxt" layoutX="175.0" layoutY="277.0" />
<Label layoutX="79.0" layoutY="277.0" text="课程名:">
<font>
<Font size="16.0" />
</font>
</Label>
</children>
</Pane>
</content>
</Tab>
<Tab text="删除课程">
<content>
<Pane prefHeight="200.0" prefWidth="200.0">
<children>
<Button layoutX="434.0" layoutY="50.0" mnemonicParsing="false" onAction="#delCourse" text="删除" />
<Label layoutX="35.0" layoutY="50.0" text="输入课程编号:">
<font>
<Font size="16.0" />
</font>
</Label>
<TextField fx:id="delTxt" layoutX="159.0" layoutY="49.0" />
</children>
</Pane>
</content>
</Tab>
</tabs>
</TabPane>
</children>
</AnchorPane>
student.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="548.0" prefWidth="699.0" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cn.edu.ncu.yang.controller.StudentAction">
<children>
<ImageView fitHeight="532.0" fitWidth="680.0" layoutX="1.0" layoutY="56.0" opacity="0.44" pickOnBounds="true" preserveRatio="true">
<image>
<Image url="@images/叶子.jpg" />
</image>
</ImageView>
<TabPane layoutY="-2.0" prefHeight="573.0" prefWidth="686.0" tabClosingPolicy="UNAVAILABLE">
<tabs>
<Tab text="首页">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
<children>
<TableView fx:id="tableView" layoutY="23.0" prefHeight="519.0" prefWidth="686.0">
<columns>
<TableColumn fx:id="course_id" prefWidth="56.000001311302185" text="课程编号" />
<TableColumn fx:id="course_name" minWidth="9.999969482421875" prefWidth="59.99997329711914" text="课程名" />
<TableColumn fx:id="course_teacher" prefWidth="66.00000762939453" text="授课老师" />
<TableColumn fx:id="course_credit" prefWidth="74.66661071777344" text="课程学分" />
<TableColumn fx:id="class_hours" minWidth="0.0" prefWidth="64.66668701171875" text="学时" />
<TableColumn fx:id="opening_term" prefWidth="78.0" text="开课学期" />
<TableColumn fx:id="student_number" prefWidth="95.99993896484375" text="课程人数" />
<TableColumn fx:id="course_nature" minWidth="0.0" prefWidth="78.66665649414062" text="课程性质" />
<TableColumn fx:id="action" minWidth="0.0" prefWidth="108.6666259765625" text="操作">
<columns>
<TableColumn fx:id="add" prefWidth="60.0" text="选课" />
<TableColumn fx:id="del" minWidth="0.0" prefWidth="48.6666259765625" text="退课" />
</columns>
</TableColumn>
</columns>
</TableView>
<TextField fx:id="infoTxt" layoutY="2.0" prefHeight="23.0" prefWidth="215.0" promptText="课程编号/授课老师/课程名/课程学分" />
<Button layoutX="491.0" layoutY="2.0" mnemonicParsing="false" onAction="#showAllCourse" prefHeight="23.0" prefWidth="92.0" text="查看所有课程" />
<Button layoutX="583.0" layoutY="2.0" mnemonicParsing="false" onAction="#showMyCourse" prefHeight="23.0" prefWidth="96.0" text="查看我的课程" />
<Button layoutX="209.0" layoutY="2.0" mnemonicParsing="false" onAction="#findCourses" text="查询" />
</children>
</AnchorPane>
</content>
</Tab>
<Tab text="我的信息">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="517.0" prefWidth="698.0">
<children>
<Button layoutX="584.0" layoutY="2.0" mnemonicParsing="false" onAction="#editInfo" text="编辑我的信息" />
<TextField fx:id="garde_m" editable="false" AnchorPane.leftAnchor="140.0" AnchorPane.topAnchor="155.0" />
<Button layoutX="435.0" layoutY="156.0" mnemonicParsing="false" onAction="#confirmInfo" text="确认修改" />
<TextField fx:id="id_m" editable="false" AnchorPane.leftAnchor="140.0" AnchorPane.topAnchor="105.0" />
<TextField fx:id="credit_m" editable="false" AnchorPane.leftAnchor="140.0" AnchorPane.topAnchor="205.0" />
<TextField fx:id="number_m" editable="false" AnchorPane.leftAnchor="140.0" AnchorPane.topAnchor="255.0" />
<Label text="总学分:" AnchorPane.leftAnchor="30.0" AnchorPane.topAnchor="210.0" />
<TextField fx:id="name_m" editable="false" AnchorPane.leftAnchor="140.0" AnchorPane.topAnchor="55.0" />
<Label text="所修课程/门:" AnchorPane.leftAnchor="30.0" AnchorPane.topAnchor="260.0" />
<Label text="班级:" AnchorPane.leftAnchor="30.0" AnchorPane.topAnchor="160.0" />
<Label layoutX="14.0" layoutY="6.0" text="姓名:" AnchorPane.leftAnchor="30.0" AnchorPane.topAnchor="60.0" />
<Label text="学号:" AnchorPane.leftAnchor="30.0" AnchorPane.topAnchor="110.0" />
<Button onAction="#showMyInfo" layoutX="544.0" layoutY="2.0" mnemonicParsing="false" text="刷新" />
</children>
</AnchorPane>
</content>
</Tab>
</tabs>
</TabPane>
</children>
</AnchorPane>
github地址
:https://github.com/Siliyoung/course_selection_system
百度网盘链接
:https://pan.baidu.com/s/1LR3buHnjBoochpdFA6eseQ?pwd=i5d5