Java实验 GUI学生成绩管理系统

一、实验内容

设计并实现一个基于图形用户界面的学生成绩管理系统,通过GUI界面完成对学生成绩信息的添加、删除和修改等操作。使用MVC结构,建立Student模型。通过实践加深对MVC模式的理解,以及数据库连接和操作的实践能力。

二、源程序

StuinfoController

package com.rjxy.controller;

import com.rjxy.dao.StuinfoDao;
import com.rjxy.model.Stuinfo;
import com.rjxy.view.StudentGUI;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.Date;

public class StuinfoController {
    // 数据层对象
    private StuinfoDao stuinfoDao = new StuinfoDao();
    public String[][] getDate(String sname) {
        // 调用数据层的方法获取数据
        String[][] data = stuinfoDao.find(sname);
        return data;
    }

    /**
     * 新增按钮的监听器
     * @return
     */
    public ActionListener addButListener() {
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 显示底部新增区域面板
                StudentGUI.southPanel.setVisible(true);
            }
        };
        return listener;
    }

    public MouseListener hideSouthPanel() {
        MouseListener listener = new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                StudentGUI.southPanel.setVisible(false);
            }
            @Override
            public void mousePressed(MouseEvent e) { }
            @Override
            public void mouseReleased(MouseEvent e) { }
            @Override
            public void mouseEntered(MouseEvent e) { }
            @Override
            public void mouseExited(MouseEvent e) { }
        };
        return listener;
    }

    public boolean saveStuinfo(String[] addDate) {
        Stuinfo stuinfo = new Stuinfo();
        stuinfo.setSname(addDate[0]);
        stuinfo.setSex(Integer.parseInt(addDate[1]));
        stuinfo.setBirthDate(Date.valueOf(addDate[2]));
        stuinfo.setClasses(addDate[3]);
        stuinfo.setgrade(Integer.parseInt(addDate[4]));
        stuinfo.setSid(addDate[5]);
        // 调用数据层方法保存数据
        int i = stuinfoDao.add(stuinfo);
        if(i>0){
            return true;
        }else {
            return false;
        }
    }

    public boolean updateStuinfo(String[] updaDate) {
        Stuinfo stuinfo = new Stuinfo();
        stuinfo.setSname(updaDate[0]);
        stuinfo.setSex(Integer.parseInt(updaDate[1]));
        stuinfo.setBirthDate(Date.valueOf(updaDate[2]));
        stuinfo.setClasses(updaDate[3]);
        stuinfo.setgrade(Integer.parseInt(updaDate[4]));
        stuinfo.setSid(updaDate[5]);
        // 调用数据层方法修改数据
        int i = stuinfoDao.update(stuinfo);
        if(i>0){
            return true;
        }else {
            return false;
        }
    }

    public boolean removeStuinfo(String value) {
        // 调用数据层方法删除数据
        int i = stuinfoDao.remove(Integer.parseInt(value));
        if(i>0){
            return true;
        }else {
            return false;
        }
    }
}

StuinfoManage

package com.rjxy.dao;

import com.rjxy.model.Stuinfo;
import com.rjxy.util.JDBCUtil;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class StuinfoManage {
    public int add(Stuinfo s){
        String sql = "insert into stuinfo values (?,?,?,?,?,?)";
        PreparedStatement pre = JDBCUtil.getPre(sql);
        try {
            pre.setString(1,s.getSname());
            pre.setInt(2,s.getSex());
            pre.setDate(3, (Date) s.getBirthDate());
            pre.setString(4,s.getClasses());
            pre.setInt(5,s.getgrade());
            pre.setString(6,s.getSid());
            int i = pre.executeUpdate();
            return i;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close();
        }
        return -1;
    }
    public int update(Stuinfo s){
        String sql = "update stuinfo set sname=?,sex=?,birthDate=?,classes=?,grade=? where sid=?";
        PreparedStatement pre = JDBCUtil.getPre(sql);
        try {
            pre.setString(1,s.getSname());
            pre.setInt(2,s.getSex());
            pre.setDate(3, (Date) s.getBirthDate());
            pre.setString(4,s.getClasses());
            pre.setInt(5,s.getgrade());
            pre.setString(6,s.getSid());
            int i = pre.executeUpdate();
            return i;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close();
        }
        return -1;
    }
    public int remove(int sid){
        String sql = "delete from stuinfo where sid=?";
        PreparedStatement pre = JDBCUtil.getPre(sql);
        try {
            pre.setInt(1,sid);
            int i = pre.executeUpdate();
            return i;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close();
        }
        return -1;
    }

    public String[][] find(String sname){
        String sql = "select * from stuinfo";
        if (null != sname && !"".equals(sname)){
            sql += " where sname like ?";
        }
        System.out.println("sql = " + sql);
        int num = findNum(sname);
        PreparedStatement pre = JDBCUtil.getPre(sql);
        try {
            if (null != sname && !"".equals(sname)){
                pre.setString(1,"%"+sname+"%");
            }
            ResultSet set = pre.executeQuery();

            String[][] list = new String[num][];
            int i = 1;
            while (set.next()){
                Stuinfo stuinfo = new Stuinfo(set.getString("sid"), set.getString("sname"), set.getInt("sex")
                        , set.getDate("birthDate"), set.getString("classes")
                        , set.getInt("grade"));
                list[i-1] = stuinfo.toArray(i);
                i++;
            }
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close();
        }
        return null;
    }
    public int findNum(String sname){
        String sql = "select count(1) from stuinfo";
        if(sname!=null && !"".equals(sname)){
            sql += " where sname like ?";
        }
        PreparedStatement pre = JDBCUtil.getPre(sql);
        try {
            if (null != sname && !"".equals(sname)){
                pre.setString(1,"%"+sname+"%");
            }
            ResultSet set = pre.executeQuery();
            set.next();

            return set.getInt(1);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close();
        }
        return 0;
    }
}

Stuinfo

package com.rjxy.model;

import java.io.Serializable;
import java.sql.Date;
import java.util.Objects;

/**
 * @ClassName Stuinfo
 * @Description 学生表实体类
 * @Author
 * Version 1.0
 **/
public class Stuinfo implements Serializable {
    private String sid;
    private String sname;
    private int sex;
    private Date birthDate;
    private String classes;
    private int grade;

    public String[] toArray(int i){
        String sex1 = sex==0?"女":"男";
        return new String[]{i+"",sid+"",sname,sex1,birthDate.toString(),classes,grade+""};
    }

    public Stuinfo() {
    }

    public Stuinfo(String sid, String sname, int sex, Date birthDate, String classes, int grade) {
        this.sid = sid;
        this.sname = sname;
        this.sex = sex;
        this.birthDate = birthDate;
        this.classes = classes;
        this.grade = grade;
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    public String getClasses() {
        return classes;
    }

    public void setClasses(String classes) {
        this.classes = classes;
    }

    public int getgrade() {
        return grade;
    }

    public void setgrade(int grade) {
        this.grade = grade;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Stuinfo stuinfo = (Stuinfo) o;
        return sid == stuinfo.sid && sex == stuinfo.sex && Objects.equals(sname, stuinfo.sname) && Objects.equals(birthDate, stuinfo.birthDate) && Objects.equals(classes, stuinfo.classes) && Objects.equals(grade, stuinfo.grade);
    }


    @Override
    public String toString() {
        return "Stuinfo{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", sex=" + sex +
                ", birthDate=" + birthDate +
                ", classes='" + classes + '\'' +
                ", grade='" + grade + '\'' +
                '}';
    }
}

JDBCUtil

package com.rjxy.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCUtil {
    /*
     数据库参数(私有静态)
     */
    private static String driver = "com.mysql.jdbc.Driver";  // 驱动类名
    private static String url = "jdbc:mysql://localhost:3306/students?characterEncoding=utf8&serverTimezone=GMT&useSSL=false";  // 数据库地址
    private static String username = "root";
    private static String password = "266920";

    private static Connection conn = null; // 连接对象
    private static PreparedStatement statement = null; //  操作对象

    /**
     *  获取JDBC操作对象的方法
     */
    public static PreparedStatement getPre(String sql) {
        try {
            Class.forName(driver);  // 加载驱动
            conn = DriverManager.getConnection(url, username, password); // 获取连接对象
            statement = conn.prepareStatement(sql);   // 获取操作对象
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 返回操作对象
        return statement;
    }

    /**
     * 关闭JDBC操作对象和连接对象
     */
    public static void close(){
        try{   // 关闭连接
            if (statement != null) statement.close();
            if (conn !=null ) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

StudentGUI

package com.rjxy.view;

import com.rjxy.conetroller.StuinfoConteroller;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class StudentGUI extends JFrame{
    // 学生控制类对象
    private StuinfoConteroller controller = new StuinfoConteroller();
    // 展示数据的表格
    JTable table = new JTable();
    // 底部面板 会在控制层调用显示
    public static JPanel southPanel = new JPanel();

    /**
     * 无参构造方法--初始化界面
     *
     */
    public StudentGUI(){
        intoGUI();
        menuBarGUI();
        mainGUI();
        bottomGUI();
    }

    /**
     * 设置界面
     * 继承了JFrame类,所以不用再new JFrame
     */
    private void intoGUI() {
        // 设置标题
        setTitle("学生成绩管理系统");
        // 设置位置和大小
        setBounds(100,100,500,600);
        // 显示界面
        setVisible(true);
        // 设置关闭方式
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    /**
     * 界面中间区域设置
     */
    public void mainGUI(){
        // 设置表格模型
        setTableModel(null);
        // 滚动面板
        JScrollPane scrollPane = new JScrollPane(table);
        // 把面板加入到界面的中间区域
        this.add(scrollPane, BorderLayout.CENTER);
        // 显示内容
        this.validate();
        // 点击中间区域时隐藏底部区域
        scrollPane.addMouseListener(controller.hideSouthPanel());
        table.addMouseListener(controller.hideSouthPanel());
    }

    /**
     * 界面底部区域
     * 存放新增界面,默认隐藏,点击新增按钮时显示
     */
    private void bottomGUI(){
        // 设置面板标题
        southPanel.setBorder(BorderFactory.createTitledBorder("新增学生信息"));
        /* 添加面板组件 */
//        southPanel.add(new JLabel("序号"));
//        JTextField index1 = new JTextField(10);
//        southPanel.add(index1);
        southPanel.add(new JLabel("姓名:"));
        JTextField suname = new JTextField(10);
        southPanel.add(suname);
        southPanel.add(new JLabel("性别"));
        ButtonGroup buttonGroup = new ButtonGroup();
        JRadioButton r1 = new JRadioButton("男");
        JRadioButton r2 = new JRadioButton("女");
        buttonGroup.add(r1);
        southPanel.add(r1);
        buttonGroup.add(r2);
        southPanel.add(r2);
        southPanel.add(new JLabel("出生日期"));
        JTextField birthday = new JTextField(10);
        southPanel.add(birthday);
        southPanel.add(new JLabel("班级"));
        JTextField classes = new JTextField(10);
        southPanel.add(classes);
        southPanel.add(new JLabel("成绩"));
        JTextField shf = new JTextField(10);
        southPanel.add(shf);
        southPanel.add(new JLabel("学号"));
        JTextField number = new JTextField(10);
        southPanel.add(number);
        JButton save = new JButton("保存");
        southPanel.add(save);
        // 设置首选大小,不设置的话底部默认大小不够
        southPanel.setPreferredSize(new Dimension(500,100));
        // 把面板加到界面中
        this.add(southPanel,BorderLayout.SOUTH);
        // 隐藏面板
        southPanel.setVisible(false);

        // 点击保存按钮的事件
        save.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 新增数据的数组
                String[] addDate = new String[6];
                // 获取输入的值
                addDate[0] = suname.getText();
                if(r1.isSelected()) addDate[1] = "1";
                if(r2.isSelected()) addDate[1] = "0";
                addDate[2] = birthday.getText();
                addDate[3] = classes.getText();
                addDate[4] = shf.getText();
                addDate[5] = number.getText();
                // 调用控制层保存数据
                boolean b = controller.saveStuinfo(addDate);
                if(b){
                    JOptionPane.showMessageDialog(southPanel.getParent(),"新增完成!!!","成功",2);
                    // 新增成功隐藏界面
                    southPanel.setVisible(false);
                    // 新增成功刷新表格
                    setTableModel(null);
                }else {
                    JOptionPane.showMessageDialog(southPanel.getParent(),"新增失败~~","错误",1);
                }
            }
        });
    }


    /**
     * 设置表格菜单栏
     * 每个菜单项用按钮组件
     * 每个按钮的监听事件在控制层定义
     */
    public void menuBarGUI(){
        // 创建菜单栏
        JMenuBar menuBar = new JMenuBar( );
        menuBar.setMargin(new Insets(3,5,5,3));
        /* 新增按钮 */
        JButton addBtu = new JButton("新增");
        // 把按钮添加到菜单栏
        menuBar.add(addBtu);
        /*  修改按钮 */
        JButton updateBtn = new JButton("修改");
        // 把按钮添加到菜单栏
        menuBar.add(updateBtn);
        // 删除按钮
        JButton removeBtn = new JButton("删除");
        // 把按钮添加到菜单栏
        menuBar.add(removeBtn);
        // 查询面板
        JButton findBtn = new JButton("查询");
        menuBar.add(findBtn);
        menuBar.add(new JLabel("姓名:"));
        JTextField findNamaInput = new JTextField(5);
        menuBar.add(findNamaInput);
        // 设置窗口菜单
        this.setJMenuBar(menuBar);


        // 设置查询按钮的监听
        findBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 查询条件
                String sname = findNamaInput.getText();
                // 按照条件刷新表格
                setTableModel(sname);
            }
        });
        // 设置新增按钮的监听
        addBtu.addActionListener(controller.addButListener());
        //  修改按钮监听事件
        updateBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 获取当前选中的行序号
                int row = table.getSelectedRow();
                /* 获取数据 */
                // 数据数组
                String[] updaDate = new String[6];
                // 获取选中行的值
                updaDate[5] = (String) table.getValueAt(row,1);
                updaDate[0] = (String) table.getValueAt(row,2);
                updaDate[1] = (String) table.getValueAt(row,3);
                updaDate[1] = "女".equals(updaDate[1])?"0":"1";
                updaDate[2] = (String) table.getValueAt(row,4);
                updaDate[3] = (String) table.getValueAt(row,5);
                updaDate[4] = (String) table.getValueAt(row,6);

                // 调用控制层修改数据
                boolean b = controller.updateStuinfo(updaDate);
                if(b){
                    JOptionPane.showMessageDialog(southPanel.getParent(),"修改完成!!!","成功",2);
                    // 新增成功刷新表格
                    setTableModel(null);
                }else {
                    JOptionPane.showMessageDialog(southPanel.getParent(),"修改失败~~","错误",1);
                }
            }
        });
        //  删除按钮监听事件
        removeBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 删除前提示
                int i = JOptionPane.showConfirmDialog(southPanel.getParent(), "删除后数据不可恢复,是否确认删除");
                System.out.println("i = " + i);
                if(i != 0) return;
                // 获取当前选中的行
                int row = table.getSelectedRow();
                // 获取学号
                String value = (String) table.getValueAt(row, 1);
                // 调用控制层修改数据
                boolean b = controller.removeStuinfo(value);
                if(b){
                    JOptionPane.showMessageDialog(southPanel.getParent(),"删除完成!!!","成功",2);
                    // 新增成功刷新表格
                    setTableModel(null);
                }else {
                    JOptionPane.showMessageDialog(southPanel.getParent(),"删除失败~~","错误",1);
                }

            }
        });

    }

    // 设置表格模板,用来更新数据
    private void setTableModel(String sname) {
        // 获取表格数据
        String[][] value = controller.getDate(sname);
        // 表格标题
        Object[] titel = {"序号","学号","姓名","性别","出生日期","班级","成绩"};
        // 表格模型
        DefaultTableModel tableModel = new DefaultTableModel(value, titel);
        table.setModel(tableModel);
    }




}

Main

package com.rjxy;

import com.rjxy.view.StudentGUI;

public class Main {
    public static void main(String[] args) {
        StudentGUI gui = new StudentGUI();
    }
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值