如何实现点击启动按钮后小车持续移动并自动重绘
解决小车点击Start后持续移动并自动重绘的问题
你的代码问题在于:虽然初始化并启动了Timer,但只有点击btnStart按钮时才会执行小车移动和重绘逻辑,Timer的定时触发事件完全没被利用——Timer每10毫秒会自动调用一次actionPerformed,但你当前的逻辑里只有按钮事件触发时才干活,自然没法持续移动。
修改方案
核心思路是用一个状态变量标记小车是否处于移动状态,让Timer的定时事件来驱动持续的移动和重绘,按钮只负责切换这个状态。
- 先给类添加状态变量并确保Timer是类成员:
private boolean isMoving = false; private Timer t; // 必须是类成员,不能是局部变量,否则会被垃圾回收
- 调整Timer的初始化(假设在构造方法中):
// 初始化Timer,间隔10毫秒,当前类作为事件监听者 t = new Timer(10, this); // 初始不启动Timer,或者启动但isMoving为false,此时不会触发移动
- 重写
actionPerformed方法:
public void actionPerformed(ActionEvent e) { // 点击Start按钮时,切换移动状态 if(e.getSource() == btnStart) { isMoving = !isMoving; // 根据状态启停Timer,节省资源 if(isMoving) { t.start(); } else { t.stop(); } } // 只要处于移动状态,每次Timer触发就执行移动+重绘 if(isMoving) { car.drive(); repaint(); } }
简化版(如果不需要暂停功能)
如果只需要点击一次Start就让小车一直跑,不需要停止,可以把逻辑简化:
public void actionPerformed(ActionEvent e) { if(e.getSource() == btnStart) { isMoving = true; // 确保Timer处于运行状态 if(!t.isRunning()) { t.start(); } } if(isMoving) { car.drive(); repaint(); } }
关键说明
- Timer的定时事件会每10毫秒触发一次
actionPerformed,当isMoving为true时,每次触发都会更新小车位置并重绘界面,实现持续移动效果。 - 必须保证Timer是类成员变量,不能是局部变量(比如不能在构造方法里定义成局部的
Timer t = new Timer(...)),否则方法执行完Timer会被垃圾回收,无法持续触发事件。 - 你原本的
drive()方法逻辑没问题,位置超过850就重置到0,这个可以保留。
内容的提问来源于stack exchange,提问作者Aejt
相关产品推荐
相关产品推荐

