Prism代码语法高亮

基于JavaSwing、MySQL的学生成绩管理系统的设计与实现


1. 系统功能

图1 系统功能结构图

2. 运行界面

图2 登录界面
图3 主界面之一
图4 主界面之二
图5 添加、修改、删除、最小化托盘

3. 创建数据库、表及输入数据

图6 创建数据库
图7 创建数据表
-- 创建数据库
use mysql;
create database 学生成绩管理系统_张晓轩 CHARACTER SET UTF8;

use 学生成绩管理系统_张晓轩;
-- 创建用户表_张晓轩
CREATE TABLE 用户表_张晓轩 (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  用户名 varchar(50) NOT NULL,
  密码 varchar(50) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB;
-- 插入一个管理员用于登录
insert into 用户表_张晓轩(用户名,密码) values('admin','123456');

-- 创建学生表
CREATE TABLE `学生成绩表_张晓轩` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `学号` varchar(50) NOT NULL,
  `姓名` varchar(50) NOT NULL,
  `住址` varchar(200) NOT NULL,
  `语文` decimal(5,2) NOT NULL DEFAULT '0.00',
  `英语` decimal(5,2) NOT NULL DEFAULT '0.00',
  `数学` decimal(5,2) NOT NULL DEFAULT '0.00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO 学生成绩表_张晓轩(学号, 姓名, 住址, 语文, 英语, 数学) VALUES 
('1000', '贾鑫萍制作', '81.70.90.149的服务器', 66, 77, 88), 
('101', '柴玉兴', '临猗县耽子镇卓里工贸区福寿屯', 82, 89, 97), 
('102', '常佳惠', '襄垣县夏店镇疙瘩头村', 96, 73, 81), 
('103', '程鹏', '大同市云冈区平泉街', 74, 89, 74), 
('104', '段飞', '新绛县龙兴镇周庄村', 72, 95, 88), 
('105', '段启遥', '平定县娘子关镇河滩村', 71, 80, 89), 
('106', '段晓龙', '文水县凤城镇宜儿村', 98, 75, 83), 
('107', '范志洋', '河北怀来玉都苑小区', 88, 97, 77), 
('108', '冯玲玉', '孝义市一家庄小区', 76, 71, 95), 
('109', '付嘉凝', '河北兴隆县蘑菇峪镇张杖子村', 75, 81, 87), 
('110', '巩浩伟', '太原市尖草坪区', 79, 95, 82), 
('111', '郭文利', '繁峙县文苑小区', 70, 73, 76), 
('112', '郭懿', '阳泉', 75, 70, 95), 
('113', '韩彦羽', '忻府区龙岗小区', 94, 91, 88), 
('114', '贺国丽', '临汾市黑龙关镇黑龙关镇', 85, 86, 87), 
('115', '侯德伟', '平遥县中都乡杜村', 76, 88, 70), 
('116', '霍碧杰', '洪洞县', 82, 82, 81), 
('117', '冀宇星', '太原市南内环街同苑小区', 86, 75, 94), 
('118', '贾鑫萍', '武乡县', 84, 91, 98), 
('119', '焦泽', '大同平城区', 91, 99, 78), 
('120', '雷一鸣', '芮城县城南村', 72, 94, 85), 
('121', '李碧云', '阳城县金山凤凰苑', 79, 72, 94), 
('122', '李超', '潞州区堠北庄镇堠西庄村', 82, 97, 83), 
('123', '李文博', '文水县凤城镇东街村友谊巷', 70, 83, 95), 
('124', '李潇', '翼城县', 95, 81, 98), 
('125', '刘建新', '平遥县东庄村文明街', 75, 90, 74), 
('126', '刘鑫鑫', '山西省', 83, 75, 97), 
('127', '柳帅', '晋中市祁县', 90, 96, 73), 
('128', '吕鑫', '云彩盐湖区三路里镇', 70, 97, 94), 
('129', '鄯宇杰', '万柏林区', 99, 95, 91), 
('130', '孙赟', '平陆县部官乡部官村', 99, 86, 73), 
('131', '王基圣', '村', 98, 76, 85), 
('132', '王佳媛', '邢台市信都区燕云台', 92, 83, 75), 
('133', '王婧', '晋中市介休市阳光嘉园', 95, 87, 79), 
('134', '王敬尧', '忻府区', 73, 88, 73), 
('135', '王琪', '屯留区上村镇上村', 99, 79, 89), 
('136', '王骞', '新绛县', 85, 91, 98), 
('137', '王瑞', '新绛县龙兴镇王庄村', 91, 90, 90), 
('138', '王泽凯', '闻喜县下丁村', 99, 78, 87), 
('139', '魏云舟', '盂县秀水镇幸福家园', 94, 80, 96), 
('140', '武才华', '尖草坪区', 73, 96, 89), 
('141', '许杰', '乡宁县光华镇', 75, 81, 86), 
('142', '杨晓凯', '离石区北川河西路西崖底', 87, 76, 95), 
('143', '杨雨欣', '陵川县龙门北巷', 79, 97, 86), 
('144', '叶锦蓉', '闻喜县郭家庄镇西宋村', 94, 71, 77), 
('145', '张佳晶', '黎城县北流村', 76, 81, 85), 
('146', '张鹏成', '文水县南安镇蔚家堡村', 87, 92, 97), 
('147', '张晓轩', '闻喜县新开南路三合巷', 79, 90, 71), 
('148', '张子怡', '垣曲县', 91, 72, 83), 
('149', '赵鹏飞', '寿阳', 92, 83, 75), 
('150', '郑佐汉', '河北石市赞皇县花林村', 86, 70, 84), 
('151', '周云龙', '忻州市忻府区', 85, 90, 96);

E-R图

图8 E-R图

4. 新建项目

图9 新建项目

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>student-swing</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--导出包含依赖jar包的可以直接运行的jar-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <!--mani不是main-->
                        <manifest>
                            <mainClass>cn.zxx.App</mainClass>
                        </manifest>
                    </archive>

                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <!--id自己起的名字-->
                        <id>贾鑫萍_jar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

5. 程序包名及其java文件列表

序号 包名 java程序名 说明
1 cn.zxx.util DBUtil.java 进行数据库的连接
DimensionUtil.java 用来获取屏幕的大小
2 cn.zxx.entity AdminDO_zxx.java 用户表信息
StudentDO_zxx.java 学生表信息
3 cn.zxx.req StudentRequest_zxx.java 访问学生信息
4 cn.zxx.res TableDTO_zxx.java 将学生信息储存在表格中
5 cn.zxx.view AddStudentView_zxx.java 主页面的各种组件
LoginView_zxx.java 登录页
MainView_zxx.java 主页面
UpdateStudentView_zxx.java 主页面的表格体
6 cn.zxx.view.ext MainViewCellRender_zxx.java 在每一行的每一列显示之前都会调用
MainViewTable_zxx.java 设置关于表格的各种参数(表头,表格体,渲染方式及多行选择)
MainViewTableModel_zxx.java 表格
7 cn.zxx.service AdminService_zxx.java 创建一个用户登录接口
StudentService_zxx.java 创建一个学生接口
8 cn.zxx.service.impl AdminServiceImpl_zxx.java 实现AdminService_cyz接口
StudentServiceImpl_zxx.java 实现StudentServiceImpl_cyz.接口
9 cn.zxx.handler AddStudentViewHandler_zxx.java 添加按钮的监听器
LoginHandler_zxx.java 登录按钮的监听器
MainViewHander_zxx.java 主页面一系列按钮的监听器
UpdateStudentViewHander_zxx.java 修改按钮的监听器
10 cn.zxx App.java 系统入口文件(main方法)<
src\ jxp.png 图标文件
1个pom.xml文件 22个java文件、1个png图标文件
图10 程序文件列表

(1) 创建cn.zxx.util包,包名下创建数据库工具类DBUtil.java

package cn.zxx.util;

import java.sql.*;

public class DBUtil {
    private static final String URL = "jdbc:mysql://81.70.90.149:3306/学生成绩管理系统_张晓轩?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false";
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String USER_NAME = "root";
    private static final String PWD = "*********";

    static {
        try {
            // com.mysql.jdbc.Driver 静态代码块
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    // 获取数据库连接
    public static Connection getConn() {
        try {
            return DriverManager.getConnection(URL,USER_NAME,PWD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void closeConn(Connection connection) {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void closePs(PreparedStatement ps) {
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void closeRs(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

(2) cn.zxx.util.DimensionUtil.java

package cn.zxx.util;

import javax.swing.*;
import java.awt.*;

public class DimensionUtil {

    public static Rectangle getBounds() {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        // 保证主界面不会覆盖电脑屏幕的任务栏
        Insets screenInsets = Toolkit.getDefaultToolkit()
                .getScreenInsets(new JFrame().getGraphicsConfiguration());

        Rectangle rectangle = new Rectangle(screenInsets.left, screenInsets.top,
                screenSize.width - screenInsets.left - screenInsets.right,
                screenSize.height - screenInsets.top - screenInsets.bottom);
        return rectangle;
    }
}

(3) 创建cn.zxx.req包,StudentRequest_zxx.java

package cn.zxx.req;

public class StudentRequest_zxx {
    private int pageNow;
    private int pageSize;
    private int start;
    // 查询词
    private String searchKey;

    public int getStart() {
        return (pageNow -1) * pageSize;
    }

    public int getPageNow() {
        return pageNow;
    }

    public void setPageNow(int pageNow) {
        this.pageNow = pageNow;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public String getSearchKey() {
        return searchKey;
    }

    public void setSearchKey(String searchKey) {
        this.searchKey = searchKey;
    }
}

(4) 创建cn.zxx.res包,包下创建TableDTO_zxx.java

package cn.zxx.res;

import java.util.Vector;

public class TableDTO_zxx {
    private Vector<Vector<Object>> data;
    private int totalCount;

    public Vector<Vector<Object>> getData() {
        return data;
    }

    public void setData(Vector<Vector<Object>> data) {
        this.data = data;
    }

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }
}

(5) 创建cn.zxx.entity包,包名下创建实体类Admin_zxx.java

package cn.zxx.entity;

public class Admin_zxx {
    private Integer id;
    private String 用户名;
    private String 密码;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String get用户名() {
        return 用户名;
    }

    public void set用户名(String 用户名) {
        this.用户名 = 用户名;
    }

    public String get密码() {
        return 密码;
    }

    public void set密码(String 密码) {
        this.密码 = 密码;
    }
}

(6) cn.zxx.entity.Student_zxx.java

package cn.zxx.entity;

public class Student_zxx {
    private Integer id;
    private String 姓名;
    private String 学号;
    private String 住址;
    private Double 语文;
    private Double 英语;
    private Double 数学;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String get姓名() {
        return 姓名;
    }

    public void set姓名(String 姓名) {
        this.姓名 = 姓名;
    }

    public String get学号() {
        return 学号;
    }

    public void set学号(String 学号) {
        this.学号 = 学号;
    }

    public String get住址() {
        return 住址;
    }

    public void set住址(String 住址) {
        this.住址 = 住址;
    }

    public Double get语文() {
        return 语文;
    }

    public void set语文(Double 语文) {
        this.语文 = 语文;
    }

    public Double get英语() {
        return 英语;
    }

    public void set英语(Double 英语) {
        this.英语 = 英语;
    }

    public Double get数学() {
        return 数学;
    }

    public void set数学(Double 数学) {
        this.数学 = 数学;
    }
}

(7) 创建cn.zxx.service包名,包名下创建接口AdminService_zxx.java

package cn.zxx.service;

import cn.zxx.entity.Admin_zxx;

public interface AdminService_zxx {
    boolean validateAdmin(Admin_zxx adminDO);
}

(8) cn.zxx.service.StudentService_zxx.java 接口文件

package cn.zxx.service;

import cn.zxx.entity.Student_zxx;
import cn.zxx.req.StudentRequest_zxx;
import cn.zxx.res.TableDTO_zxx;

public interface StudentService_zxx {

    TableDTO_zxx retrieveStudents(StudentRequest_zxx request);

    boolean add(Student_zxx studentDO);

    Student_zxx getById(int selectedStudentId);

    boolean update(Student_zxx studentDO);

    boolean delete(int[] selectedStudentIds);
}

(9) 创建包cn.zxx.service.impl,包下创建接口实现类AdminServiceImpl_zxx.java

package cn.zxx.service.impl;

import cn.zxx.entity.Admin_zxx;
import cn.zxx.util.DBUtil;
import cn.zxx.service.AdminService_zxx;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class AdminServiceImpl_zxx implements AdminService_zxx {
    @Override
    public boolean validateAdmin(Admin_zxx adminDO) {
        String userName = adminDO.get用户名();
        String pwdParam = adminDO.get密码();
        String sql = "select 密码 from 用户表_张晓轩 where 用户名 = ?";
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet resultSet = null;
        try {
            conn = DBUtil.getConn();
            if (conn == null) {
                return false;
            }
            ps = conn.prepareStatement(sql);
            ps.setString(1, userName);
            resultSet = ps.executeQuery();
            while (resultSet.next()) {
                String pwd = resultSet.getString(1);
                if (pwdParam.equals(pwd)) {
                    return true;
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBUtil.closeRs(resultSet);
            DBUtil.closePs(ps);
            DBUtil.closeConn(conn);
        }
        return false;
    }
}

(10) cn.zxx.service.impl.StudentServiceImpl_zxx.java 实现类

package cn.zxx.service.impl;

import cn.zxx.entity.Student_zxx;
import cn.zxx.req.StudentRequest_zxx;
import cn.zxx.res.TableDTO_zxx;
import cn.zxx.util.DBUtil;
import cn.zxx.service.StudentService_zxx;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

public class StudentServiceImpl_zxx implements StudentService_zxx {
    @Override
    public TableDTO_zxx retrieveStudents(StudentRequest_zxx request) {
        StringBuilder sql = new StringBuilder();
        sql.append("select * from 学生成绩表_张晓轩 ");
        if (request.getSearchKey() != null && !"".equals(request.getSearchKey().trim())) {
            sql.append(" where 姓名 like '%"+request.getSearchKey().trim()+"%'");
        }
        sql.append("order by id asc limit ").append(request.getStart()).append(",")
                .append(request.getPageSize());
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        TableDTO_zxx returnDTO = new TableDTO_zxx();
        try {
            conn = DBUtil.getConn();
            ps = conn.prepareStatement(sql.toString());
            rs = ps.executeQuery();
            // 查询记录
            returnDTO.setData(fillData(rs));

            sql.setLength(0);
            sql.append("select count(*) from 学生成绩表_张晓轩 ");
            if (request.getSearchKey() != null && !"".equals(request.getSearchKey().trim())) {
                sql.append(" where 姓名 like '%"+request.getSearchKey().trim()+"%'");
            }
            ps = conn.prepareStatement(sql.toString());
            rs = ps.executeQuery();
            while (rs.next()) {
                int count = rs.getInt(1);
                returnDTO.setTotalCount(count);
            }
            return returnDTO;
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBUtil.closeRs(rs);
            DBUtil.closePs(ps);
            DBUtil.closeConn(conn);
        }
        return null;
    }

    @Override
    public boolean add(Student_zxx studentDO) {
        StringBuilder sql = new StringBuilder();
        sql.append(" insert into 学生成绩表_张晓轩(姓名,学号,住址,语文,英语,数学) ");
        sql.append(" values(?,?,?,?,?,?) ");
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = DBUtil.getConn();
            ps = conn.prepareStatement(sql.toString());
            ps.setString(1,studentDO.get姓名());
            ps.setString(2,studentDO.get学号());
            ps.setString(3,studentDO.get住址());
            ps.setDouble(4,studentDO.get语文());
            ps.setDouble(5,studentDO.get英语());
            ps.setDouble(6,studentDO.get数学());
            return ps.executeUpdate() == 1;
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBUtil.closePs(ps);
            DBUtil.closeConn(conn);
        }
        return false;
    }

    @Override
    public Student_zxx getById(int selectedStudentId) {
        StringBuilder sql = new StringBuilder("select * from 学生成绩表_张晓轩 where id = ? ");
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Student_zxx studentDO = new Student_zxx();
        try {
            conn = DBUtil.getConn();
            ps = conn.prepareStatement(sql.toString());
            ps.setInt(1,selectedStudentId);
            rs = ps.executeQuery();
            while (rs.next()) {
                // 处理查出的每一条记录
                studentDO.setId(rs.getInt("id"));
                studentDO.set姓名(rs.getString("姓名"));
                studentDO.set学号(rs.getString("学号"));
                studentDO.set住址(rs.getString("住址"));
                studentDO.set语文(rs.getDouble("语文"));
                studentDO.set英语(rs.getDouble("英语"));
                studentDO.set数学(rs.getDouble("数学"));
            }
            return studentDO;
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBUtil.closeRs(rs);
            DBUtil.closePs(ps);
            DBUtil.closeConn(conn);
        }
        return null;
    }

    @Override
    public boolean update(Student_zxx studentDO) {
        StringBuilder sql = new StringBuilder();
        sql.append(" update 学生成绩表_张晓轩 set 姓名 = ?,学号=?,住址=?,语文=?,英语=?,数学=? ");
        sql.append(" where id =? ");
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = DBUtil.getConn();
            ps = conn.prepareStatement(sql.toString());
            ps.setString(1,studentDO.get姓名());
            ps.setString(2,studentDO.get学号());
            ps.setString(3,studentDO.get住址());
            ps.setDouble(4,studentDO.get语文());
            ps.setDouble(5,studentDO.get英语());
            ps.setDouble(6,studentDO.get数学());
            ps.setInt(7,studentDO.getId());
            return ps.executeUpdate() == 1;
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBUtil.closePs(ps);
            DBUtil.closeConn(conn);
        }
        return false;
    }

    @Override
    public boolean delete(int[] selectedStudentIds) {
        StringBuilder sql = new StringBuilder();
        sql.append(" delete from 学生成绩表_张晓轩 where id in ( ");
        int length = selectedStudentIds.length;
        for (int i = 0; i < length; i++) {
            if (i == (length - 1)) {
                sql.append(" ? ");
            }else {
                sql.append(" ?, ");
            }
        }
        sql.append(" ) ");
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = DBUtil.getConn();
            ps = conn.prepareStatement(sql.toString());
            for (int i = 0; i < length; i++) {
                // 设置参数,从1开始
                ps.setInt(i + 1, selectedStudentIds[i]);
            }
            return ps.executeUpdate() == length;
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBUtil.closePs(ps);
            DBUtil.closeConn(conn);
        }
        return false;
    }

    private Vector<Vector<Object>> fillData(ResultSet rs) throws SQLException {
        Vector<Vector<Object>> data = new Vector<>();
        while (rs.next()) {
            // 处理查出的每一条记录
            Vector<Object> oneRecord = new Vector<>();
            double cnScore = rs.getDouble("语文");
            double enScore = rs.getDouble("英语");
            double mathScore = rs.getDouble("数学");
            double totalScore = cnScore + enScore + mathScore;
            oneRecord.addElement(rs.getInt("id"));
            oneRecord.addElement(rs.getString("姓名"));
            oneRecord.addElement(rs.getString("学号"));
            oneRecord.addElement(rs.getString("住址"));
            oneRecord.addElement(cnScore);
            oneRecord.addElement(enScore);
            oneRecord.addElement(mathScore);
            oneRecord.addElement(totalScore);
            data.addElement(oneRecord);
        }
        return data;
    }
}

(11) 创建cn.zxx.view.ext包,包下创建MainViewTableModel_zxx.java

package cn.zxx.view.ext;

import javax.swing.table.DefaultTableModel;
import java.util.Vector;

public class MainViewTableModel_zxx extends DefaultTableModel {

    static Vector<String> columns = new Vector<>();
    static {
        columns.addElement("编号");
        columns.addElement("姓名");
        columns.addElement("学号");
        columns.addElement("住址");
        columns.addElement("语文");
        columns.addElement("数学");
        columns.addElement("英语");
        columns.addElement("总分");
    }

    private MainViewTableModel_zxx() {
        super(null,columns);
    }

    private static MainViewTableModel_zxx mainViewTableModel = new MainViewTableModel_zxx();

    public static MainViewTableModel_zxx assembleModel(Vector<Vector<Object>> data) {
        mainViewTableModel.setDataVector(data,columns);
        return mainViewTableModel;
    }

    public static void updateModel(Vector<Vector<Object>> data) {
        mainViewTableModel.setDataVector(data,columns);
    }

    public static Vector<String> getColumns() {
        return columns;
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }
}

(12) cn.zxx.view.ext.MainViewCellRender_zxx.java

package cn.zxx.view.ext;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;

public class MainViewCellRender_zxx extends DefaultTableCellRenderer {
    // 在每一行的每一列显示之前都会调用
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if (row % 2 == 0) {
            setBackground(Color.ORANGE); //.LIGHT_GRAY);
        } else {
            setBackground(Color.WHITE);
        }
        // 第3列住址左齐
        if (column == 3){
            setHorizontalAlignment(DefaultTableCellRenderer.LEFT);
        }else{
            setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        }

        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }
}

(13) cn.zxx.view.ext.MainViewTable_zxx.java

package cn.zxx.view.ext;

import javax.swing.*;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import java.awt.*;
import java.util.Vector;

public class MainViewTable_zxx extends JTable {

    public MainViewTable_zxx() {
        JTableHeader tableHeader = getTableHeader();
        tableHeader.setFont(new Font(null,Font.BOLD,16));
        tableHeader.setForeground(Color.RED);
        // 设置表格体
        setFont(new Font(null,Font.PLAIN,14));
        setForeground(Color.black);
        setGridColor(Color.BLACK);
        setRowHeight(30);
        // 设置多行选择
        getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    }

    public void renderRule() {
        // 设置表格列的渲染方式
        Vector<String> columns = MainViewTableModel_zxx.getColumns();
        MainViewCellRender_zxx render = new MainViewCellRender_zxx();
        for (int i =0;i < columns.size();i++) {
            TableColumn column = getColumn(columns.get(i));
            column.setCellRenderer(render);
            if (i == 0) {
                column.setPreferredWidth(50);
                column.setMaxWidth(50);
                column.setResizable(false);
            }
            if (i == 3) {
                column.setPreferredWidth(400);
                column.setMaxWidth(400);
                column.setResizable(true);
            }
        }
    }
}

(14) 创建cn.zxx.view包,包下创建添加学生成绩的JDialog程序AddStudentView_zxx.java

package cn.zxx.view;

import cn.zxx.entity.Student_zxx;
import cn.zxx.handler.AddStuViewHandler_zxx;

import javax.swing.*;
import java.awt.*;

public class AddStudentView_zxx extends JDialog {
    private static final long serialVersionUID = 1L;
    JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.CENTER,10,20));
    JLabel nameLabel = new JLabel("姓名:",JLabel.RIGHT);
    JTextField nameTxt = new JTextField();
    JLabel noLabel = new JLabel("学号:",JLabel.RIGHT);
    JTextField noTxt = new JTextField();
    JLabel homeLabel = new JLabel("住址:",JLabel.RIGHT);
    JTextField homeTxt = new JTextField();
    JLabel cnLabel = new JLabel("语文成绩:",JLabel.RIGHT);
    JTextField cnTxt = new JTextField();
    JLabel mathLabel = new JLabel("数学成绩:",JLabel.RIGHT);
    JTextField mathTxt = new JTextField();
    JLabel enLabel = new JLabel("英语成绩:",JLabel.RIGHT);
    JTextField enTxt = new JTextField();
    JButton addBtn = new JButton("添加");

    AddStuViewHandler_zxx addStudentViewHandler;
    public AddStudentView_zxx(MainView_zxx mainView){
        super(mainView,"添加学生",true);

        addStudentViewHandler = new AddStuViewHandler_zxx(this,mainView);
        nameLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(nameLabel);
        nameTxt.setPreferredSize(new Dimension(200,30));
        jPanel.add(nameTxt);

        noLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(noLabel);
        noTxt.setPreferredSize(new Dimension(200,30));
        jPanel.add(noTxt);

        homeLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(homeLabel);
        homeTxt.setPreferredSize(new Dimension(200,30));
        jPanel.add(homeTxt);

        cnLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(cnLabel);
        cnTxt.setPreferredSize(new Dimension(200,30));
        jPanel.add(cnTxt);

        enLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(enLabel);
        enTxt.setPreferredSize(new Dimension(200,30));
        jPanel.add(enTxt);

        mathLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(mathLabel);
        mathTxt.setPreferredSize(new Dimension(200,30));
        jPanel.add(mathTxt);

        addBtn.addActionListener(addStudentViewHandler);
        jPanel.add(addBtn);

        Container contentPane = getContentPane();
        contentPane.add(jPanel);

        setSize(350,500);
        setLocationRelativeTo(null);
        // DISPOSE_ON_CLOSE:只销毁当前的窗体
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setResizable(false);
        setVisible(true);
    }

    public Student_zxx buildStudentDO() {
        Student_zxx studentDO = new Student_zxx();
        studentDO.set姓名(nameTxt.getText());
        studentDO.set学号(noTxt.getText());
        studentDO.set住址(homeTxt.getText());
        studentDO.set语文(Double.valueOf(cnTxt.getText()));
        studentDO.set英语(Double.valueOf(enTxt.getText()));
        studentDO.set数学(Double.valueOf(mathTxt.getText()));
        return studentDO;
    }
}

(15) 修改学生成绩的JDialog程序 cn.zxx.view.UpdateStudentView_zxx.java

package cn.zxx.view;

import cn.zxx.entity.Student_zxx;
import cn.zxx.handler.UpdStuViewHandler_zxx;
import cn.zxx.service.StudentService_zxx;
import cn.zxx.service.impl.StudentServiceImpl_zxx;

import javax.swing.*;
import java.awt.*;

public class UpdateStudentView_zxx extends JDialog {
    JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.CENTER,10,20));
    JLabel idLabel = new JLabel("id:",JLabel.RIGHT);
    JTextField idTxt = new JTextField();
    JLabel nameLabel = new JLabel("姓名:",JLabel.RIGHT);
    JTextField nameTxt = new JTextField();
    JLabel noLabel = new JLabel("学号:",JLabel.RIGHT);
    JTextField noTxt = new JTextField();
    JLabel homeLabel = new JLabel("住址:",JLabel.RIGHT);
    JTextField homeTxt = new JTextField();
    JLabel cnLabel = new JLabel("语文成绩:",JLabel.RIGHT);
    JTextField cnTxt = new JTextField();
    JLabel mathLabel = new JLabel("数学成绩:",JLabel.RIGHT);
    JTextField mathTxt = new JTextField();
    JLabel enLabel = new JLabel("英语成绩:",JLabel.RIGHT);
    JTextField enTxt = new JTextField();
    JButton updateBtn = new JButton("修改");

    UpdStuViewHandler_zxx updateStudentViewHandler;
    public UpdateStudentView_zxx(MainView_zxx mainView, int selectedStudentId){
        super(mainView,"修改学生",true);

        updateStudentViewHandler = new UpdStuViewHandler_zxx(this,mainView);
        // 查询selectedStudentId对应的记录并回显
        StudentService_zxx studentService = new StudentServiceImpl_zxx();
        Student_zxx selectedStu = studentService.getById(selectedStudentId);
        idLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(idLabel);
        idTxt.setPreferredSize(new Dimension(200,30));
        idTxt.setText(selectedStu.getId() + "");
        // 设置id不可编辑
        idTxt.setEnabled(false);
        jPanel.add(idTxt);

        nameLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(nameLabel);
        nameTxt.setPreferredSize(new Dimension(200,30));
        nameTxt.setText(selectedStu.get姓名());
        jPanel.add(nameTxt);

        noLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(noLabel);
        noTxt.setPreferredSize(new Dimension(200,30));
        noTxt.setText(selectedStu.get学号());
        jPanel.add(noTxt);

        homeLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(homeLabel);
        homeTxt.setText(selectedStu.get住址());
        homeTxt.setPreferredSize(new Dimension(200,30));
        jPanel.add(homeTxt);

        cnLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(cnLabel);
        cnTxt.setPreferredSize(new Dimension(200,30));
        cnTxt.setText(String.valueOf(selectedStu.get语文()));
        jPanel.add(cnTxt);

        enLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(enLabel);
        enTxt.setPreferredSize(new Dimension(200,30));
        enTxt.setText(String.valueOf(selectedStu.get英语()));
        jPanel.add(enTxt);

        mathLabel.setPreferredSize(new Dimension(80,30));
        jPanel.add(mathLabel);
        mathTxt.setText(String.valueOf(selectedStu.get数学()));
        mathTxt.setPreferredSize(new Dimension(200,30));
        jPanel.add(mathTxt);

        updateBtn.addActionListener(updateStudentViewHandler);
        jPanel.add(updateBtn);

        Container contentPane = getContentPane();
        contentPane.add(jPanel);

        setSize(350,500);
        setLocationRelativeTo(null);
        // DISPOSE_ON_CLOSE:只销毁当前的窗体
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setResizable(false);
        setVisible(true);
    }

    /*
    获取修改后的学生对象
     */
    public Student_zxx builjxppdatedStudentDO() {
        Student_zxx studentDO = new Student_zxx();
        studentDO.setId(Integer.valueOf(idTxt.getText()));
        studentDO.set姓名(nameTxt.getText());
        studentDO.set学号(noTxt.getText());
        studentDO.set住址(homeTxt.getText());
        studentDO.set语文(Double.valueOf(cnTxt.getText()));
        studentDO.set英语(Double.valueOf(enTxt.getText()));
        studentDO.set数学(Double.valueOf(mathTxt.getText()));
        return studentDO;
    }
}

(16) 主控界面JFrame程序 cn.zxx.view.MainView_zxx.java,并将图标文件1.jpg存储在src下

package cn.zxx.view;

import cn.zxx.handler.MainViewHandler_zxx;
import cn.zxx.req.StudentRequest_zxx;
import cn.zxx.res.TableDTO_zxx;
import cn.zxx.service.StudentService_zxx;
import cn.zxx.service.impl.StudentServiceImpl_zxx;
import cn.zxx.util.DimensionUtil;
import cn.zxx.view.ext.MainViewTableModel_zxx;
import cn.zxx.view.ext.MainViewTable_zxx;

import javax.swing.*;
import java.awt.*;
import java.net.URL;

public class MainView_zxx extends JFrame{
    JPanel northPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JButton addBtn = new JButton("增加");
    JButton updateBtn = new JButton("修改");
    JButton delBtn = new JButton("删除");
    JTextField searchTxt = new JTextField(15);
    JButton searchBtn = new JButton("查询");

    JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    JButton preBtn = new JButton("上一页");
    JButton nextBtn = new JButton("下一页");

    MainViewTable_zxx mainViewTable = new MainViewTable_zxx();
    private int pageNow = 1; // 当前是第几页
    private int pageSize = 10; // 一页显示多少条记录

    MainViewHandler_zxx mainViewHandler;
    public MainView_zxx() {
        super("主界面-学生成绩管理【贾鑫萍研习】for MySQL");
        Container contentPane = getContentPane();
        Rectangle bounds = DimensionUtil.getBounds();
        pageSize = Math.floorDiv(bounds.height,35);

        mainViewHandler = new MainViewHandler_zxx(this);
        // 放置北边的组件
        layoutNorth(contentPane);
        // 设置中间的jtable
        layoutCenter(contentPane);

        //放置南边的组件
        layoutSouth(contentPane);

        // 自定义图标
        URL imgUrl = MainView_zxx.class.getClassLoader().getResource("jxp.png");
        setIconImage(new ImageIcon(imgUrl).getImage());
        // 根据屏幕大小设置主界面大小
        setBounds(bounds);
        // 设置窗体完全充满整个屏幕的可见大小
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(true);
        setVisible(true);
    }

    private void layoutCenter(Container contentPane) {
        TableDTO_zxx dto = getTableDTO();
        MainViewTableModel_zxx mainViewTableModel = MainViewTableModel_zxx.assembleModel(dto.getData());
        // 把jtable和model关联
        mainViewTable.setModel(mainViewTableModel);
        mainViewTable.renderRule();
        JScrollPane jScrollPane = new JScrollPane(mainViewTable);
        contentPane.add(jScrollPane,BorderLayout.CENTER);
        showPreNext(dto.getTotalCount());
    }

    private TableDTO_zxx getTableDTO() {
        StudentService_zxx studentService = new StudentServiceImpl_zxx();
        StudentRequest_zxx request = new StudentRequest_zxx();
        request.setPageNow(pageNow);
        request.setPageSize(pageSize);
        request.setSearchKey(searchTxt.getText().trim());
        TableDTO_zxx tableDTO = studentService.retrieveStudents(request);
        return tableDTO;
    }

    private void layoutSouth(Container contentPane) {
        preBtn.addActionListener(mainViewHandler);
        nextBtn.addActionListener(mainViewHandler);
        southPanel.add(preBtn);
        southPanel.add(nextBtn);
        contentPane.add(southPanel,BorderLayout.SOUTH);
    }
    /*
    设置上一页下一页是否可见
     */
    private void showPreNext(int totalCount) {
        if (pageNow == 1) {
            preBtn.setVisible(false);
        } else {
            preBtn.setVisible(true);
        }
        int pageCount = 0;//总共有多少页
        if (totalCount % pageSize == 0) {
            pageCount = totalCount / pageSize;
        } else {
            pageCount = totalCount / pageSize + 1;
        }
        if (pageNow == pageCount) {
            nextBtn.setVisible(false);
        } else {
            nextBtn.setVisible(true);
        }
    }

    private void layoutNorth(Container contentPane) {
        // 增加事件监听
        addBtn.addActionListener(mainViewHandler);
        updateBtn.addActionListener(mainViewHandler);
        delBtn.addActionListener(mainViewHandler);
        searchBtn.addActionListener(mainViewHandler);
        northPanel.add(addBtn);
        northPanel.add(updateBtn);
        northPanel.add(delBtn);
        northPanel.add(searchTxt);
        northPanel.add(searchBtn);
        contentPane.add(northPanel,BorderLayout.NORTH);
    }


    public static void main(String[] args) {
        new MainView_zxx();
    }

    public void setPageNow(int pageNow) {
        this.pageNow = pageNow;
    }

    public int getPageNow() {
        return pageNow;
    }

    public void reloadTable() {
        TableDTO_zxx dto = getTableDTO();
        MainViewTableModel_zxx.updateModel(dto.getData());
        mainViewTable.renderRule();
        showPreNext(dto.getTotalCount());
    }

    public int[] getSelectedStudentIds() {
        int[] selectedRows = mainViewTable.getSelectedRows();
        int[] ids = new int[selectedRows.length];
        for (int i = 0; i < selectedRows.length ;i++) {
            int rowIndex = selectedRows[i];
            Object idObj = mainViewTable.getValueAt(rowIndex, 0);
            ids[i] = Integer.valueOf(idObj.toString());
        }
        return ids;
    }
}

(17) 登录界面JFrame程序 cn.zxx.view.LoginView_zxx.java

package cn.zxx.view;

import cn.zxx.handler.LoginHandler_zxx;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;

public class LoginView_zxx extends JFrame{
    JLabel nameLabel = new JLabel("学生成绩管理 for MySQL",JLabel.CENTER);

    SpringLayout springLayout = new SpringLayout();
    JPanel centerPanel = new JPanel(springLayout);
    JLabel userNameLabel = new JLabel("用户名:");
    JTextField userTxt = new JTextField();
    JLabel pwdLabel = new JLabel("密  码:");
    JPasswordField pwdField = new JPasswordField();
    JButton loginBtn = new JButton("登录");
    JButton resetBtn = new JButton("重置");

    SystemTray systemTray;
    TrayIcon trayIcon;
    LoginHandler_zxx loginHandler;
    public LoginView_zxx() {
        super("JavaSwing项目[贾鑫萍研习] for MySQL8.0.26");

        loginHandler = new LoginHandler_zxx(this);

        Container contentPane = getContentPane();

        nameLabel.setFont(new Font("楷体",Font.PLAIN,40));
        nameLabel.setPreferredSize(new Dimension(0,80));

        Font centerFont = new Font("楷体", Font.PLAIN, 20);
        userNameLabel.setFont(centerFont);
        userTxt.setPreferredSize(new Dimension(200,30));
        pwdLabel.setFont(centerFont);
        pwdField.setPreferredSize(new Dimension(200,30));
        loginBtn.setFont(centerFont);
        resetBtn.setFont(centerFont);
        // 把组件加入面板
        centerPanel.add(userNameLabel);
        centerPanel.add(userTxt);
        centerPanel.add(pwdLabel);
        centerPanel.add(pwdField);
        loginBtn.addActionListener(loginHandler);
        // 增加按键事件
        loginBtn.addKeyListener(loginHandler);
        centerPanel.add(loginBtn);
        resetBtn.addActionListener(loginHandler);
        centerPanel.add(resetBtn);
        // 弹簧布局
        layoutCenter();


        contentPane.add(nameLabel,BorderLayout.NORTH);
        contentPane.add(centerPanel,BorderLayout.CENTER);

        if (SystemTray.isSupported()) {
            systemTray = SystemTray.getSystemTray();
            URL imgUrl = LoginView_zxx.class.getClassLoader().getResource("jxp.png");
            trayIcon = new TrayIcon(new ImageIcon(imgUrl).getImage());
            // 设置托盘图片大小自动缩放
            trayIcon.setImageAutoSize(true);
            try {
                systemTray.add(trayIcon);
            } catch (AWTException e) {
                e.printStackTrace();
            }
            // 增加最小化时销毁资源
            this.addWindowListener(new WindowAdapter() {
                @Override
                public void windowIconified(WindowEvent e) {
                    LoginView_zxx.this.dispose();
                }
            });
            // 托盘事件监听
            trayIcon.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    int clickCount = e.getClickCount();
                    if (clickCount == 1) {
                        LoginView_zxx.this.setExtendedState(JFrame.NORMAL);
                    }
                    LoginView_zxx.this.setVisible(true);
                }
            });
        }

        // 设置loginBtn为默认按钮
        getRootPane().setDefaultButton(loginBtn);
        // 自定义图标
        URL imgUrl = LoginView_zxx.class.getClassLoader().getResource("jxp.png");
        setIconImage(new ImageIcon(imgUrl).getImage());
        setSize(600,400);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);
    }

    private void layoutCenter() {
        // 布局userNameLabel
        Spring childWidth = Spring.sum(Spring.sum(Spring.width(userNameLabel), Spring.width(userTxt)),
                Spring.constant(20));
        int offsetX = childWidth.getValue() / 2 +30;
        springLayout.putConstraint(SpringLayout.WEST,userNameLabel,-offsetX,
                SpringLayout.HORIZONTAL_CENTER,centerPanel);
        springLayout.putConstraint(SpringLayout.NORTH,userNameLabel,20,SpringLayout.NORTH,centerPanel);
        // userTxt
        springLayout.putConstraint(SpringLayout.WEST,userTxt,20,SpringLayout.EAST,userNameLabel);
        springLayout.putConstraint(SpringLayout.NORTH,userTxt,0,SpringLayout.NORTH,userNameLabel);
        // pwdLabel
        springLayout.putConstraint(SpringLayout.EAST,pwdLabel,0,SpringLayout.EAST,userNameLabel);
        springLayout.putConstraint(SpringLayout.NORTH,pwdLabel,20,SpringLayout.SOUTH,userNameLabel);
        // pwdField
        springLayout.putConstraint(SpringLayout.WEST,pwdField,20,SpringLayout.EAST,pwdLabel);
        springLayout.putConstraint(SpringLayout.NORTH,pwdField,0,SpringLayout.NORTH,pwdLabel);
        // loginBtn
        springLayout.putConstraint(SpringLayout.WEST,loginBtn,50,SpringLayout.WEST,pwdLabel);
        springLayout.putConstraint(SpringLayout.NORTH,loginBtn,20,SpringLayout.SOUTH,pwdLabel);
        // resetBtn
        springLayout.putConstraint(SpringLayout.WEST,resetBtn,50,SpringLayout.EAST,loginBtn);
        springLayout.putConstraint(SpringLayout.NORTH,resetBtn,0,SpringLayout.NORTH,loginBtn);
    }

    public static void main(String[] args) {
        new LoginView_zxx();
    }

    public JTextField getUserTxt() {
        return userTxt;
    }

    public JPasswordField getPwdField() {
        return pwdField;
    }

}

(18 ) 创建cn.zxx.handler包,创建AddStuViewHandler_zxx.java

package cn.zxx.handler;

import cn.zxx.entity.Student_zxx;
import cn.zxx.service.StudentService_zxx;
import cn.zxx.service.impl.StudentServiceImpl_zxx;
import cn.zxx.view.AddStudentView_zxx;
import cn.zxx.view.MainView_zxx;

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

public class AddStuViewHandler_zxx implements ActionListener {

    private AddStudentView_zxx addStudentView;
    private MainView_zxx mainView;
    public AddStuViewHandler_zxx(AddStudentView_zxx addStudentView, MainView_zxx mainView) {
        this.addStudentView = addStudentView;
        this.mainView = mainView;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton jButton = (JButton) e.getSource();
        String text = jButton.getText();
        if ("添加".equals(text)) {
            StudentService_zxx studentService = new StudentServiceImpl_zxx();
            Student_zxx studentDO = addStudentView.buildStudentDO();
            boolean addResult = studentService.add(studentDO);
            if (addResult) {
                // 重新加载表格查到最新数据
                mainView.reloadTable();
                addStudentView.dispose();
            } else {
                JOptionPane.showMessageDialog(addStudentView,"添加失败");
            }
        }
    }
}

(19 ) cn.zxx.handler.UpdStuViewHandler_zxx.java

package cn.zxx.handler;

import cn.zxx.entity.Student_zxx;
import cn.zxx.service.StudentService_zxx;
import cn.zxx.service.impl.StudentServiceImpl_zxx;
import cn.zxx.view.MainView_zxx;
import cn.zxx.view.UpdateStudentView_zxx;

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

public class UpdStuViewHandler_zxx implements ActionListener {

    private UpdateStudentView_zxx updateStudentView;
    private MainView_zxx mainView;
    public UpdStuViewHandler_zxx(UpdateStudentView_zxx updateStudentView, MainView_zxx mainView) {
        this.updateStudentView = updateStudentView;
        this.mainView = mainView;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton jButton = (JButton) e.getSource();
        String text = jButton.getText();
        if ("修改".equals(text)) {
            StudentService_zxx studentService = new StudentServiceImpl_zxx();
            Student_zxx studentDO = updateStudentView.builjxppdatedStudentDO();
            boolean updateResult = studentService.update(studentDO);
            if (updateResult) {
                // 重新加载表格查到最新数据
                mainView.reloadTable();
                updateStudentView.dispose();
            } else {
                JOptionPane.showMessageDialog(updateStudentView,"修改失败");
            }
        }
    }
}

(20) cn.zxx.handler.MainViewHandler_zxx.java

package cn.zxx.handler;

import cn.zxx.service.StudentService_zxx;
import cn.zxx.service.impl.StudentServiceImpl_zxx;
import cn.zxx.view.AddStudentView_zxx;
import cn.zxx.view.MainView_zxx;
import cn.zxx.view.UpdateStudentView_zxx;

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

public class MainViewHandler_zxx implements ActionListener {

    private MainView_zxx mainView;

    public MainViewHandler_zxx(MainView_zxx mainView) {
        this.mainView = mainView;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton jButton = (JButton) e.getSource();
        String text = jButton.getText();
        if ("增加".equals(text)) {
            new AddStudentView_zxx(mainView);
        } else if ("修改".equals(text)) {
            int[] selectedStudentIds = mainView.getSelectedStudentIds();
            if (selectedStudentIds.length != 1) {
                JOptionPane.showMessageDialog(mainView, "一次只能修改一行!");
                return;
            }
            new UpdateStudentView_zxx(mainView, selectedStudentIds[0]);
        } else if ("删除".equals(text)) {
            int[] selectedStudentIds = mainView.getSelectedStudentIds();
            if (selectedStudentIds.length == 0) {
                JOptionPane.showMessageDialog(mainView, "请选择要删除的行!");
                return;
            }
            int option = JOptionPane.showConfirmDialog(mainView, "你确认要删除选择的" + selectedStudentIds.length + "行吗?",
                    "确认删除", JOptionPane.YES_NO_OPTION);
            if (option == JOptionPane.YES_OPTION) { // 确认
                // 执行删除
                StudentService_zxx studentService = new StudentServiceImpl_zxx();
                boolean deleteResult = studentService.delete(selectedStudentIds);
                if (deleteResult) {
                    // 重新加载表格查到最新数据
                    mainView.reloadTable();
                } else {
                    JOptionPane.showMessageDialog(mainView, "删除失败");
                }
            }
        } else if ("查询".equals(text)) {
            mainView.setPageNow(1);
            mainView.reloadTable();
        } else if ("上一页".equals(text)) {
            mainView.setPageNow(mainView.getPageNow() - 1);
            mainView.reloadTable();
        } else if ("下一页".equals(text)) {
            mainView.setPageNow(mainView.getPageNow() + 1);
            mainView.reloadTable();
        }
    }
}

(21) cn.zxx.handler.LoginHandler_zxx.java

package cn.zxx.handler;

import cn.zxx.entity.Admin_zxx;
import cn.zxx.service.AdminService_zxx;
import cn.zxx.service.impl.AdminServiceImpl_zxx;
import cn.zxx.view.LoginView_zxx;
import cn.zxx.view.MainView_zxx;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class LoginHandler_zxx extends KeyAdapter implements ActionListener {

    private LoginView_zxx loginView;
    public LoginHandler_zxx(LoginView_zxx loginView) {
        this.loginView = loginView;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton jButton = (JButton) e.getSource();
        String text = jButton.getText();
        if ("重置".equals(text)) {
            loginView.getUserTxt().setText("");
            loginView.getPwdField().setText("");
        }else if ("登录".equals(text)) {
            login();
        }
    }

    private void login() {
        String user = loginView.getUserTxt().getText();
        char[] chars = loginView.getPwdField().getPassword();
        if (user == null || "".equals(user.trim()) ||
                chars == null) {
            JOptionPane.showMessageDialog(loginView,"用户名密码必填");
            return;
        }
        String pwd = new String(chars);
        System.out.println(user + ":" + pwd);
        // 查询db
        AdminService_zxx adminService = new AdminServiceImpl_zxx();
        Admin_zxx adminDO = new Admin_zxx();
        adminDO.set用户名(user);
        adminDO.set密码(pwd);
        boolean flag = adminService.validateAdmin(adminDO);
        if (flag) {
            // 跳转到主界面并销毁登录界面
            new MainView_zxx();
            loginView.dispose();
        }else {
            JOptionPane.showMessageDialog(loginView,"用户名密码错误");
        }
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (KeyEvent.VK_ENTER == e.getKeyCode()) {
            login();
        }
    }
}

(22) 系统入口程序 cn.zxx.App.java

package cn.zxx;

import cn.zxx.view.LoginView_zxx;

public class App {
    public static void main( String[] args ) {
        new LoginView_zxx();
    }
}

5. 打包导出、上传

图11 项目打包

student-swing-1.0-SNAPSHOT-jar-with-dependencies.jar 复制副本并更名为 学生成绩管理系统_张晓轩.jar 上传云端供下载运行。

图12 更名上传

运行命令:

java -jar 学生成绩管理系统_张晓轩.jar
图13 项目运行

如何把Spring Boot的Jar包做成exe?超详细教程来了!

https://zhuanlan.zhihu.com/p/400040834


返回