尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Java Swing实现的SQL Server工资管理桌面程序(含完整源码与可运行class文件)

Java Swing实现的SQL Server工资管理桌面程序(含完整源码与可运行class文件)
📅 发布时间:2026/7/3 0:03:29

本文还有配套的精品资源,点击获取

简介:一个专为高校课程设计准备的工资管理桌面工具,用Java Swing开发界面,后端对接SQL Server数据库。支持员工信息全生命周期操作——添加、删除、修改、按姓名或工号精准查询;部门信息维护;薪资录入、调整与历史记录追踪;多条件薪资查询(按人、按部门、按工号);密码修改与登录验证;以及基础薪资分布统计分析。所有Java源文件均已编译生成.class字节码,关键逻辑配有中文注释,开箱即用。项目结构清晰,类命名直观:MainFrame是主窗口入口,login处理身份校验,AddEmployee/DeleteEmployee分别负责员工增删,InquireOnName/InquireOnNo实现两种检索方式,AnalyseSalary提供统计能力,ConnectTest和DBConnect保障数据库连接稳定。适合教学演示、课程作业提交或作为二次开发起点。

1. 项目概述:为什么这个工资系统值得大学生花时间吃透?

你是不是正在为《Java程序设计》或《数据库原理与应用》的期末课程设计发愁?老师布置了“做一个带数据库的桌面管理系统”,但一打开IDEA就卡在登录界面怎么连SQL Server、员工列表怎么动态刷新、查询结果怎么塞进JTable里……别急,这套Java Swing工资管理系统,就是我当年带学生做实训时反复打磨出来的“教学锚点”——它不追求炫酷动画或微服务架构,而是把高校课程设计最常踩的坑、最易失分的细节,全摊开在你眼前。核心关键词“Java工资系统”“SQL Server实训”“Swing桌面应用”“高校课程设计”,不是空泛标签,而是每一行代码都在回应:如何让一个零数据库经验的大三学生,在两周内交出一份逻辑自洽、能跑通、能讲清楚、还能应付答辩提问的完整作品?

我试过让学生直接抄GitHub上那些“高大上”的Spring Boot工资系统,结果90%的人卡在Maven依赖冲突、MyBatis配置报错、甚至Tomcat启动失败;而用这个Swing+SQL Server方案,你只需要装好JDK 8/11、SQL Server Express(免费版)、SQL Server Management Studio(SSMS),再配好JDBC驱动,双击Main.class就能看到登录框弹出来。它用最朴素的技术栈,解决最实际的教学痛点:界面交互是否直观?数据库操作是否可追溯?异常处理是否真实?注释是否能让你看懂“为什么这里要先清空表格再填充数据”?比如InquireOnName.java里那句tableModel.setRowCount(0);,旁边注释写着“防止多次查询结果叠加显示”,这比教科书上干巴巴的“清空表格模型”更戳中初学者的困惑。它不是一个成品软件,而是一套“可拆解、可验证、可提问”的教学脚手架——你删掉一个类,系统立刻报错;你改一行SQL,查询结果马上变化;你断开数据库,ConnectTest.java会明确告诉你“连接超时,请检查SQL Server服务是否运行”。这种即时反馈,才是课程设计该有的学习节奏。

2. 整体架构与设计思路:为什么选Swing+SQL Server而不是其他组合?

2.1 技术选型背后的教学逻辑

很多同学第一反应是:“现在都2024年了,还学Swing?太老了吧!”这话没错,但放在高校课程设计场景下,恰恰是它最大的优势。我们来算一笔账:一个典型的课程设计周期是2~3周,学生平均每天能投入的有效编码时间约2小时。如果选Web技术栈(比如Spring Boot + Vue),光是环境搭建(JDK+Maven+Node.js+Vue CLI+数据库驱动)就要耗掉1.5天;遇到“Thymeleaf模板找不到”或“跨域请求被拦截”,查文档+问群+重装环境又得半天;等页面终于跑起来,发现后端返回的JSON格式不对,还得回头调Controller层……整个过程像在迷宫里找出口,而课程设计的核心目标——理解“数据如何从数据库经Java处理最终呈现到用户界面”——反而被层层抽象掩盖了。

Swing则完全不同。它把“界面-逻辑-数据”三者牢牢焊死在同一进程里:JButton点击触发ActionListener,ActionListener里直接写JDBC查询,查询结果ResultSet逐行读取后塞进DefaultTableModel,DefaultTableModel绑定到JTable,整个链条肉眼可见、调试器一步一跟。我在指导学生时,会让ta在login.java的checkLogin()方法里打个断点,输入账号密码后F8单步执行,亲眼看着PreparedStatement.executeQuery()返回ResultSet,再看着rs.next()循环把数据赋值给user对象——这种“所见即所得”的调试体验,是任何Web框架都给不了的教学价值。SQL Server的选择同理:相比MySQL,它的图形化管理工具SSMS更符合国内高校机房的预装习惯;相比SQLite,它强制要求你理解“服务实例”“登录账户”“数据库权限”这些真实企业级概念;而DBConnect.java里那句DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=SalaryDB;user=sa;password=123456;"),就是你第一次亲手拼接的生产级连接字符串,里面每个参数的意义(localhost:1433是默认端口,databaseName指定库名,user/password是SQL Server认证凭据),都是答辩时老师最爱问的基础题。

2.2 模块化设计:如何让代码既清晰又防抄袭?

翻开源码目录,你会发现命名极度“直男”:AddEmployee.java、DeleteEmployee.java、InquireOnName.java……没有IEmployeeService或EmployeeControllerImpl这类让人头晕的接口实现类。这不是偷懒,而是刻意为之的教学设计。高校课程设计最怕什么?是学生从网上抄一套代码,改个包名就交作业,结果答辩时被问“InquireSalaryChange.java和InquireySalary.java有什么区别”,当场哑火。这套系统的类命名,本身就是一道防伪墙——InquireSalaryChange查的是薪资调整历史记录(含旧薪资、新薪资、调整时间),InquireySalary(注意是y不是i)查的是某月薪资明细(工资条),两个功能完全独立,命名差异直指业务本质。你在AnalyseSalary.java里看到的饼图统计,用的是JFreeChart库,但代码只做了最基础的PieDataset填充和JPanel嵌入,没封装成复杂图表组件——因为课程设计考察的是“能否用Java实现业务逻辑”,而不是“会不会调第三方图表API”。

模块间的依赖关系也刻意扁平化。所有数据库操作都通过DBConnect.java这个单例类统一管理,它内部封装了连接池(虽然只是简单的ArrayList<Connection>模拟,但足够教学演示),ConnectTest.java专门用来测试这个连接池是否健康。你看不到Spring的@Autowired或Hibernate的SessionFactory,所有Connection对象都是显式new DBConnect().getConnection()获取,用完显式close()。这种“笨办法”强迫你理解资源释放的重要性——我见过太多学生在AddEmployee.java里忘了关PreparedStatement,导致插入10条员工数据后,第11条就报“连接数超限”,这时候翻DBConnect.java里的getCount()方法,立刻明白问题在哪。这种设计,让代码不再是黑盒,而是可触摸、可质疑、可修改的学习材料。

2.3 安全与健壮性:课程设计不该回避真实问题

有些同学会疑惑:“登录就用明文密码校验?这也太不安全了吧?”——这恰恰是本项目最硬核的教学点。login.java里的密码校验逻辑是:

String sql = "SELECT * FROM Users WHERE username=? AND password=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); // 注意:这里确实是明文!

但它旁边紧跟着一行注释:“教学演示用,实际项目需MD5/SHA256加密存储,此处为简化流程”。这意味着什么?意味着你在答辩时,如果老师问“如何提升安全性”,你可以自信地回答:“我会在用户注册时用MessageDigest.getInstance("MD5").digest(password.getBytes())生成哈希值存库,登录时对输入密码做同样哈希再比对;同时增加盐值(salt)防止彩虹表攻击。”——这比背诵“应该用加密”有用一百倍。同样,ChangePassword.java里有完整的密码二次确认逻辑(两次输入必须一致),MainFrame.java主窗口关闭时会弹出“确认退出”对话框,这些细节不是炫技,而是告诉你:一个合格的桌面应用,边界条件处理比核心功能更重要。我曾让学生故意在AddDepartment.java的部门名称输入框里敲入100个字符,结果发现数据库字段dept_name VARCHAR(50)被截断,这时ta才真正理解“为什么建表时要定义字段长度”,而不是只在实验报告里抄一句“保证数据完整性”。

3. 核心模块解析与实操要点:从登录到统计,每一步都在教你“怎么想”

3.1 登录验证模块(login.java):不只是跳转,更是状态管理的起点

登录模块看似简单,却是整个系统状态流转的枢纽。login.java继承自JFrame,包含用户名密码输入框、登录按钮和“忘记密码”链接(虽未实现,但预留了JLabel占位)。关键不在UI,而在checkLogin()方法的三层校验逻辑:

第一层是前端空值校验:

if (username.trim().isEmpty() || password.trim().isEmpty()) { JOptionPane.showMessageDialog(this, "用户名或密码不能为空!", "输入错误", JOptionPane.ERROR_MESSAGE); return; }

这里trim()去首尾空格是很多学生忽略的细节——用户可能误按空格键,导致“admin ”和“admin”被视为不同账号。第二层是数据库查询校验,用PreparedStatement防止SQL注入(哪怕教学场景,也要种下安全意识的种子)。第三层是登录成功后的状态传递:它不直接new MainFrame().setVisible(true),而是通过this.dispose()关闭登录窗,再new MainFrame(username).setVisible(true)将当前用户名传给主窗口。这个username参数在MainFrame.java里被存为private String currentUser;,后续所有操作日志(如薪资调整记录)都会带上操作人信息,这就是真实业务系统中“操作留痕”的雏形。

提示:调试登录失败时,先运行ConnectTest.java确认数据库连通性;再用SSMS手动执行SELECT * FROM Users WHERE username='admin',检查表是否存在、数据是否正确;最后在login.java的checkLogin()里加System.out.println("SQL执行前: " + sql);打印实际执行语句,排除拼写错误。

3.2 员工全生命周期管理(Add/Delete/ChangeEmployee.java):CRUD背后的事务思维

员工增删改是系统最频繁的操作,也是最容易出错的模块。以AddEmployee.java为例,它的核心不是“把数据插进数据库”,而是如何保证数据一致性。比如添加新员工时,需要同时向Employees表插入基本信息,并向SalaryRecords表插入当月薪资记录。代码里没有用@Transactional,而是用最原始的JDBC事务控制:

conn.setAutoCommit(false); // 关闭自动提交 try { // 插入Employees String empSql = "INSERT INTO Employees (...) VALUES (...)"; ps1 = conn.prepareStatement(empSql); // 插入SalaryRecords String salSql = "INSERT INTO SalaryRecords (...) VALUES (...)"; ps2 = conn.prepareStatement(salSql); conn.commit(); // 两步都成功才提交 } catch (SQLException e) { conn.rollback(); // 任一步失败就回滚 JOptionPane.showMessageDialog(this, "添加失败:" + e.getMessage()); } finally { conn.setAutoCommit(true); // 恢复自动提交 }

这段代码的价值,远超“学会写INSERT语句”。它逼着你思考:如果只插了员工没插薪资,系统会出现“有员工没工资”的脏数据;如果只插了薪资没插员工,SalaryRecords.emp_id外键会指向不存在的员工ID,违反参照完整性。DeleteEmployee.java同理,删除前会先查询该员工是否有未发放薪资记录,若有则弹窗提示“请先处理薪资再删除”,而不是粗暴DELETE FROM Employees——这是在教你怎么用SQL的EXISTS子查询做业务前置校验。

注意:ChangeEmployee.java的修改逻辑有个精妙设计——它不是直接UPDATE Employees SET ... WHERE emp_id=?,而是先用SELECT * FROM Employees WHERE emp_id=?查出原数据,显示在修改窗体的文本框里,用户改完再对比新旧值。只有当某个字段确实被修改了(比如姓名从“张三”改成“张四”),才生成对应的UPDATE语句。这样避免无意义的数据库写操作,也方便后续做“修改日志”(虽然当前版本没实现,但代码结构已预留扩展点)。

3.3 多维度薪资查询(InquireOnName/InquireOnNo/InquireDepartment.java):SQL能力的实战考场

查询模块是检验你SQL功底的试金石。InquireOnName.java支持模糊查询,SQL语句是:

SELECT e.emp_id, e.name, e.dept_id, d.dept_name, s.base_salary, s.bonus FROM Employees e JOIN Departments d ON e.dept_id = d.dept_id JOIN SalaryRecords s ON e.emp_id = s.emp_id WHERE e.name LIKE ?

参数?传入的是"%"+name+"%",实现“张”能搜出“张三”“李张峰”。而InquireOnNo.java用的是精确匹配emp_id = ?,InquireDepartment.java则要关联三个表(Employees、Departments、SalaryRecords)并按部门分组统计平均薪资:

SELECT d.dept_name, COUNT(e.emp_id) as emp_count, AVG(s.base_salary) as avg_salary FROM Departments d LEFT JOIN Employees e ON d.dept_id = e.dept_id LEFT JOIN SalaryRecords s ON e.emp_id = s.emp_id GROUP BY d.dept_name

这里用LEFT JOIN而非INNER JOIN,是为了确保即使某部门暂无员工(如新成立的“AI研发部”),查询结果里依然会显示该部门,emp_count为0——这是真实业务中常见的“保底展示”需求。我在指导学生时,会让ta把InquireDepartment.java里的SQL复制到SSMS里手动执行,观察结果集结构,再对照Java代码里tableModel.addColumn("部门名称"); tableModel.addColumn("员工数"); tableModel.addColumn("平均薪资");的列定义,理解“数据库字段”和“表格列”的映射关系。这种“数据库→Java→界面”的端到端追踪,是课程设计最该掌握的能力。

3.4 数据分析模块(AnalyseSalary.java):从数字到图表的思维跃迁

AnalyseSalary.java用JFreeChart生成薪资分布饼图,但重点不在绘图API,而在数据准备逻辑。它不直接查SalaryRecords表,而是先执行聚合SQL:

SELECT CASE WHEN base_salary < 5000 THEN '5K以下' WHEN base_salary BETWEEN 5000 AND 10000 THEN '5K-10K' ELSE '10K以上' END as salary_range, COUNT(*) as count FROM SalaryRecords GROUP BY CASE WHEN base_salary < 5000 THEN '5K以下' WHEN base_salary BETWEEN 5000 AND 10000 THEN '5K-10K' ELSE '10K以上' END

这个SQL的精妙之处在于:用CASE WHEN在数据库层完成分段统计,而不是把几万条原始薪资数据全查出来,再用Java循环判断分段——前者效率高,后者内存爆。查询结果ResultSet被遍历后,构建DefaultPieDataset:

PieDataset dataset = new DefaultPieDataset(); while (rs.next()) { dataset.setValue(rs.getString("salary_range"), rs.getInt("count")); }

然后ChartFactory.createPieChart(...)生成图表,最后chartPanel = new ChartPanel(chart);嵌入Swing容器。整个过程,把“数据分析”拆解为“SQL聚合→Java数据结构转换→图表渲染”三步,每一步都可调试、可替换。比如你想改成柱状图,只需换createBarChart();想按部门分析,就把SQL里的CASE WHEN换成d.dept_name分组。这种模块化思维,比死记硬背JFreeChart的100个参数重要得多。

4. 实操全流程:从零开始运行、调试、二次开发的完整指南

4.1 环境搭建:三步到位,拒绝“环境配置失败”

第一步:安装必备软件
- JDK 8 或 11(推荐OpenJDK 11,官网下载后配置JAVA_HOME和PATH)
- SQL Server Express 2019(微软官网免费下载,安装时勾选“SQL Server和Windows身份验证模式”,设置sa账户密码为123456)
- SQL Server Management Studio(SSMS,用于建库建表)

第二步:创建数据库与表结构
打开SSMS,用sa账户登录,新建查询,执行以下SQL(这是项目隐含的数据库契约,必须严格遵循):

-- 创建数据库 CREATE DATABASE SalaryDB; GO USE SalaryDB; GO -- 创建部门表 CREATE TABLE Departments ( dept_id INT PRIMARY KEY IDENTITY(1,1), dept_name NVARCHAR(50) NOT NULL ); -- 创建员工表 CREATE TABLE Employees ( emp_id INT PRIMARY KEY IDENTITY(1,1), name NVARCHAR(50) NOT NULL, gender CHAR(2), birth_date DATE, dept_id INT, hire_date DATE, CONSTRAINT FK_Emp_Dept FOREIGN KEY (dept_id) REFERENCES Departments(dept_id) ); -- 创建薪资记录表 CREATE TABLE SalaryRecords ( record_id INT PRIMARY KEY IDENTITY(1,1), emp_id INT NOT NULL, month_year CHAR(7) NOT NULL, -- 格式:2024-06 base_salary DECIMAL(10,2), bonus DECIMAL(10,2), total_salary AS (base_salary + ISNULL(bonus, 0)), CONSTRAINT FK_Sal_Emp FOREIGN KEY (emp_id) REFERENCES Employees(emp_id) ); -- 创建用户表(登录用) CREATE TABLE Users ( user_id INT PRIMARY KEY IDENTITY(1,1), username NVARCHAR(50) UNIQUE NOT NULL, password NVARCHAR(50) NOT NULL, role NVARCHAR(20) DEFAULT 'user' -- 'admin' or 'user' ); -- 插入测试数据 INSERT INTO Departments (dept_name) VALUES ('技术部'), ('销售部'), ('人事部'); INSERT INTO Users (username, password, role) VALUES ('admin', '123456', 'admin'), ('user1', '123456', 'user');

提示:执行完务必右键“SalaryDB”→“刷新”,确认三张表已创建。如果报错“对象名’dbo.Departments’无效”,说明没执行USE SalaryDB;。

第三步:配置JDBC驱动与运行
- 下载mssql-jdbc-9.4.1.jre11.jar(微软官方JDBC驱动,适配JDK11)
- 将jar包放入项目根目录,或在IDEA中Project Structure → Libraries添加
- 双击Main.class(或命令行java -cp ".;mssql-jdbc-9.4.1.jre11.jar" Main)启动程序

4.2 调试技巧:快速定位90%的常见问题

问题现象可能原因排查步骤解决方案
启动报错ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriverJDBC驱动未加载检查DBConnect.java第1行Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");是否执行;确认jar包路径正确将mssql-jdbc-*.jar加入classpath,或在IDEA中Run → Edit Configurations → VM options添加-cp ".;path/to/jar"
登录时提示“连接数据库失败”SQL Server服务未启动或连接参数错误运行ConnectTest.java;检查DBConnect.java中url字符串(localhost:1433端口是否被占用?databaseName=SalaryDB库名是否拼错?)在Windows服务里启动SQL Server (MSSQLSERVER);用SSMS连接localhost测试;确保sa密码与代码中一致
查询结果为空,但数据库有数据SQL语句逻辑错误或参数未绑定在InquireOnName.java的executeQuery()前加System.out.println("执行SQL: " + sql + ", 参数: " + name);用SSMS执行相同SQL,确认语法;检查ps.setString(1, "%"+name+"%")中name变量是否为空字符串
添加员工后,JTable不刷新表格模型未更新在AddEmployee.java的insert成功后,检查是否调用了MainFrame.refreshEmployeeTable()(或类似方法)确保新增逻辑末尾有tableModel.addRow(new Object[]{...});或MainFrame.getInstance().refreshTable();

实操心得:我让学生养成“三查”习惯——查数据库(SSMS里看数据是否真存在)、查SQL(把Java里拼的SQL复制到SSMS执行)、查日志(System.out.println()是Swing调试的最强武器)。有一次学生InquireOnNo.java一直查不到数据,最后发现是工号输入框里多了一个不可见的中文全角空格,trim()后问题解决。这种细节,只有亲手调试才能记住。

4.3 二次开发入门:三个安全又出彩的改造方向

方向一:增强登录安全性(适合答辩加分项)
-目标:将明文密码改为MD5哈希存储
-步骤:
1. 修改login.java的checkLogin():String inputHash = DigestUtils.md5Hex(password);(需引入Apache Commons Codec库)
2. 修改Users表,将password字段类型改为VARCHAR(32)
3. 修改注册逻辑(若项目有),注册时存DigestUtils.md5Hex(inputPassword)
-价值:展示你理解密码安全的基本实践,答辩时可延伸讨论“为什么不用SHA1”“盐值怎么加”。

方向二:导出Excel报表(实用功能升级)
-目标:在AnalyseSalary.java的饼图下方加“导出Excel”按钮
-步骤:
1. 引入poi-ooxml-5.2.4.jar(Apache POI库)
2. 编写exportToExcel()方法:创建XSSFWorkbook,用ResultSet数据填充XSSFSheet
3. 调用JFileChooser选择保存路径,FileOutputStream写入文件
-价值:解决真实业务需求(领导要看Excel报表),且POI是Java领域最常用的Excel处理库,学了不白学。

方向三:添加数据校验规则(体现工程思维)
-目标:在AddEmployee.java中,对出生日期做逻辑校验(不能大于今天,不能小于1950年)
-步骤:
java try { LocalDate birth = LocalDate.parse(birthText, DateTimeFormatter.ofPattern("yyyy-MM-dd")); if (birth.isAfter(LocalDate.now()) || birth.isBefore(LocalDate.of(1950, 1, 1))) { throw new IllegalArgumentException("出生日期不合理"); } } catch (DateTimeParseException e) { JOptionPane.showMessageDialog(this, "日期格式错误,应为yyyy-MM-dd"); return; }
-价值:展示你考虑了用户输入的任意性,比单纯“非空校验”更深入一层。

5. 常见问题与避坑指南:那些我没在代码里写的“血泪教训”

5.1 数据库连接相关问题(占调试时间的70%)

问题1:“驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server建立安全连接”
-原因:新版SQL Server JDBC驱动默认启用SSL,但本地Express版可能未配置证书
-解决方案:在DBConnect.java的连接URL末尾添加;encrypt=false;trustServerCertificate=true,即:
java String url = "jdbc:sqlserver://localhost:1433;databaseName=SalaryDB;user=sa;password=123456;encrypt=false;trustServerCertificate=true;";

问题2:“登录失败,用户‘sa’登录失败”
-原因:SQL Server默认禁用sa账户,或密码错误
-解决方案:
1. 打开SSMS,用Windows身份验证登录
2. 展开“安全性”→“登录名”→右键sa→“属性”
3. 勾选“启用”,在“状态”页确认“登录”设为“授予”
4. 在“常规”页重置密码为123456

问题3:“数据库‘SalaryDB’不存在”
-原因:建库SQL执行失败,或库名大小写敏感(Linux服务器上)
-解决方案:在SSMS中执行SELECT name FROM sys.databases;确认库名是否为SalaryDB(注意大小写),若为salarydb,则修改DBConnect.java中的databaseName参数。

5.2 Swing界面与事件处理陷阱

问题1:JTable点击无反应,或双击编辑不生效
-原因:JTable默认不可编辑,且未设置MouseListener
-解决方案:在MainFrame.java初始化表格后,添加:
java table.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { // 双击 int row = table.getSelectedRow(); if (row >= 0) { String empId = table.getValueAt(row, 0).toString(); // 假设第一列是工号 new ChangeEmployee(empId).setVisible(true); // 弹出修改窗 } } } });

问题2:窗口关闭后程序未退出,后台Java进程仍在运行
-原因:Swing默认关闭操作是HIDE_ON_CLOSE,不是EXIT_ON_CLOSE
-解决方案:在MainFrame.java构造方法末尾添加:
java this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
同时在login.java登录成功后,确保this.dispose()关闭登录窗,否则两个JFrame共存会消耗资源。

5.3 编译与运行时经典错误

问题1:“找不到或无法加载主类Main”
-原因:Main.java里public static void main(String[] args)方法签名错误,或类路径未包含当前目录
-解决方案:检查Main.java是否为public class Main(类名必须与文件名一致),且main方法是public static void;命令行运行时用java -cp ".;mssql-jdbc.jar" Main(Windows)或java -cp ".:mssql-jdbc.jar" Main(Mac/Linux)。

问题2:“Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException”
-原因:在事件监听器中访问了尚未初始化的对象(如JTable table为null)
-解决方案:在MainFrame.java中,确保所有组件(JTable、JButton等)在initComponents()方法里完成初始化,且监听器代码在initComponents()之后注册。调试时在可疑行前加System.out.println("table=" + table);确认是否为null。

最后分享一个小技巧:每次修改完代码,不要急着运行,先用IDEA的Analyze → Inspect Code扫描一遍。它会标出Resource leak: 'conn' is never closed(资源泄漏)、Duplicated code(重复代码)等警告,这些都是课程设计评分细则里明确扣分的点。我带的学生里,凡是认真对待这些警告的,答辩分数普遍高出10分以上——因为老师一眼就能看出,这是个真正动手调试过、思考过代码质量的人。

本文还有配套的精品资源,点击获取

简介:一个专为高校课程设计准备的工资管理桌面工具,用Java Swing开发界面,后端对接SQL Server数据库。支持员工信息全生命周期操作——添加、删除、修改、按姓名或工号精准查询;部门信息维护;薪资录入、调整与历史记录追踪;多条件薪资查询(按人、按部门、按工号);密码修改与登录验证;以及基础薪资分布统计分析。所有Java源文件均已编译生成.class字节码,关键逻辑配有中文注释,开箱即用。项目结构清晰,类命名直观:MainFrame是主窗口入口,login处理身份校验,AddEmployee/DeleteEmployee分别负责员工增删,InquireOnName/InquireOnNo实现两种检索方式,AnalyseSalary提供统计能力,ConnectTest和DBConnect保障数据库连接稳定。适合教学演示、课程作业提交或作为二次开发起点。


本文还有配套的精品资源,点击获取

相关新闻

  • EulerPublisher开发者指南:如何扩展新云厂商支持和自定义构建流程
  • 自然语言驱动Playwright自动化测试:基于MCP协议的零代码实践
  • 4-20mA电流环原理与STM32+XTR116工业级实现

最新新闻

  • 搜索框防抖 + 竞态完整总结
  • 第1章. 故事的缘起
  • 把《呼吸里的爱》放回真实生活里听
  • 升级纯血鸿蒙后,小艺Agent和伴随式AI能做什么?
  • AI时代必备:100个实战场景提升效率与生活质量
  • ActiveReportsJS如何在Angular报表设计器中构建资产负债表

日新闻

  • JMeter接口测试实战:从核心元件到复杂场景构建
  • Java Applet版刽子手游戏源码:含完整项目结构、吊杆绘图与胜负逻辑
  • 使用Apache JMeter对RoadRunner PHP应用进行性能测试与调优指南

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号