核心是用jlabel显示目标文本、jtextfield/jtextarea接收输入,逐字符比对需记录光标位置并实时比较,用timer实现倒计时,注意中文输入法兼容与编码utf-8统一。

用Swing显示实时输入框和目标文本
打字游戏的核心是对比用户输入与预设文本,所以界面至少要有两个区域:显示目标句子的只读区域、接收用户按键的输入区域。Swing里最直接的做法是用 JLabel 显示目标文本(避免用户误改),用 JTextField 或 JTextArea 接收输入——但注意,JTextField 单行更适合短句练习,JTextArea 配合 setLineWrap(true) 更适合段落;如果想限制用户只能逐字输入(比如高亮已对/错字符),就别用普通输入组件,改用 JPanel + 动态生成 JLabel 字符数组,再监听 KeyEvent 手动更新状态。
逐字符比对逻辑与实时反馈实现
不能等用户输完再校验,得在每次按键后立刻判断当前字符是否匹配。关键点有三个:记录当前光标位置(用整型变量 cursorPos)、获取目标字符串的第 cursorPos 个字符(targetString.charAt(cursorPos))、比较 KeyEvent.getKeyChar() 与之是否相等。常见错误是忽略大小写或空格处理——比如目标是 "Hello World",用户输 "h" 应判错,但若需求允许忽略大小写,就得统一转成小写再比;还有回车、退格键必须单独拦截,否则会破坏位置同步。建议在 keyPressed 里先 if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE) 处理退格逻辑,再更新 cursorPos。
用Timer控制倒计时与游戏结束判定
限时打字游戏离不开 javax.swing.Timer。不要用 Thread.sleep() 或循环等待,那会卡死UI线程。创建 Timer 时传入毫秒间隔(如 new Timer(1000, e -> { secondsLeft--; })),启动后每秒减一,当 secondsLeft == 0 时调用 timer.stop() 并弹出结果面板。注意:Timer 的 ActionListener 运行在事件分发线程(EDT),可以直接更新 Swing 组件;但如果你在倒计时期间还要统计正确率,记得把 correctCount 和 totalTyped 设为 volatile 或用原子类,避免多线程读写冲突(虽然本例通常单线程操作,但留个心眼没坏处)。
中文字符输入与编码兼容性问题
Java 内部用 Unicode,理论上支持中文,但实际遇到的问题常出在输入法和焦点上。Swing 组件默认能接收中文,但如果你发现用户用拼音输入法敲出“你好”后只触发一次 keyTyped 事件(对应一个合成事件),而你按单字比对就会错乱——这时应监听 keyReleased,并在里面用 textField.getText().length() 获取当前总长度,结合上次长度差值判断新增了几个字符。另外,确保源文件保存为 UTF-8,IDE 编译编码设为 UTF-8,否则中文字符串字面量可能变成乱码;Maven 项目还需在 pom.xml 中配置 <project.build.sourceencoding>UTF-8</project.build.sourceencoding>。
立即学习“Java免费学习笔记(深入)”;
字符高亮、速度计算(WPM)、历史记录存档这些进阶功能,都建立在上述四点稳定运行的基础上。最容易被跳过的其实是输入法兼容处理和 Timer 的线程安全边界——很多 demo 跑在英文环境没问题,一换中文输入法就失步,根源往往在这里。









