You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现点击启动按钮后小车持续移动并自动重绘

解决小车点击Start后持续移动并自动重绘的问题

你的代码问题在于:虽然初始化并启动了Timer,但只有点击btnStart按钮时才会执行小车移动和重绘逻辑,Timer的定时触发事件完全没被利用——Timer每10毫秒会自动调用一次actionPerformed,但你当前的逻辑里只有按钮事件触发时才干活,自然没法持续移动。

修改方案

核心思路是用一个状态变量标记小车是否处于移动状态,让Timer的定时事件来驱动持续的移动和重绘,按钮只负责切换这个状态。

  1. 先给类添加状态变量并确保Timer是类成员:
private boolean isMoving = false;
private Timer t; // 必须是类成员,不能是局部变量,否则会被垃圾回收
  1. 调整Timer的初始化(假设在构造方法中):
// 初始化Timer,间隔10毫秒,当前类作为事件监听者
t = new Timer(10, this);
// 初始不启动Timer,或者启动但isMoving为false,此时不会触发移动
  1. 重写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:43:22