Swing是Java桌面问卷系统的最稳选择,组件成熟、文档全、不依赖额外模块;用JFrame+JPanel+JRadioButton/JCheckBox组合5分钟可搭建界面,需在EDT中创建组件、用ButtonGroup管理单选、SwingWorker防卡顿、PreparedStatement防注入、SQLite本地存储、DAO封装隔离数据库逻辑。

用Swing快速搭出问卷界面,别碰JavaFX
Swing仍是Java桌面问卷系统的最稳选择——组件成熟、文档全、不依赖额外模块。JavaFX虽新但打包复杂,尤其在企业内网或老旧JRE环境下容易报NoClassDefFoundError。直接用JFrame + JPanel + JRadioButton/JCheckBox组合,5分钟就能跑起来。
关键点:
- 所有UI组件必须在事件分发线程(EDT)中创建:用
SwingUtilities.invokeLater()包裹主窗口初始化 - 单选题用
ButtonGroup管理JRadioButton,否则多选失效 - 避免在
actionPerformed里写耗时操作(如数据库写入),用SwingWorker防界面卡死 - 字段校验放在提交前,别等
INSERT失败才弹窗——用户看不到SQLException里的SQLState
用JDBC连SQLite存问卷结果,省掉服务端
问卷系统不需要MySQL或PostgreSQL。SQLite文件即数据库,sqlite-jdbc一个jar搞定,无安装、无配置。路径用相对路径"data/survey.db",程序启动时检查文件是否存在,不存在就执行建表语句。
建表示例(适配常见题型):
立即学习“Java免费学习笔记(深入)”;
CREATE TABLE IF NOT EXISTS responses ( id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp TEXT NOT NULL, q1_score INTEGER, -- 单选:1~5评分 q2_option TEXT, -- 单选:A/B/C/D q3_text TEXT, -- 简答 q4_tags TEXT -- 多选(逗号拼接:"Java,Swing,SQLite") );
注意:
- 别用
Statement拼接SQL,一律用PreparedStatement防SQL注入,哪怕只是本地工具 -
q4_tags字段不用单独建关联表——问卷回收量少于1万条时,字符串分割比JOIN快且易维护 - 写入后调用
connection.commit(),别依赖自动提交,否则批量提交时可能丢数据
把数据库操作封装成独立类,别塞进GUI代码里
把SurveyDAO类拆出来,只暴露saveResponse(Map和getSummary()两个方法。GUI层完全不知道SQL长什么样,也不关心是SQLite还是H2。
这样做的实际好处:
- 测试方便:用
H2 in-memory替换SQLite做单元测试,不用改一行业务逻辑 - 导出功能好加:后续想加Excel导出,只改
SurveyDAO,界面按钮逻辑不动 - 字段变更安全:比如把
q2_option改成枚举,只需改DAO的setObject参数,JComboBox选中的值照常传字符串过去
启动时报java.lang.UnsatisfiedLinkError?检查JDBC驱动版本
常见于Windows下用新版sqlite-jdbc(比如3.45+)跑在JRE 8上。错误信息通常是no sqlitejdbc in java.library.path或类似Can't load library。
解法很直接:
- 降级驱动:用
org.xerial:sqlite-jdbc:3.42.0.0,它对JRE 8兼容性最稳 - 确认jar包没被Maven scope误设为
test或provided - 如果用IDE运行,检查
Run Configuration → Classpath是否真包含了该jar;如果打jar包运行,用jar -tf your-app.jar | grep sqlite验证是否打进去了
真正麻烦的是跨平台打包——Windows能跑的jar,在macOS上可能因SQLite原生库不匹配而静默失败,这时得在SurveyDAO构造器里加个try-catch捕获SQLException并弹窗提示“数据库初始化失败”,而不是让程序直接退出。










