我的计时器 (scheduleAtFixedRate) 不循环

My timer (scheduleAtFixedRate) doesnt loop

在下面的程序中,我尝试反复交换两个图像,以创建行走效果。为此,我创建了一个计时器,其中 img3 的源在 Bob1 和 Bob2 之间交替更改。这很好用。但是,我当然希望动画在您停止移动时暂停。所以我在 运行 方法中放置了一个 if - 语句。如果我使用未更改的变量,这也有效。但是,如果我使用 moveleft 变量(如果 d 被按下则为 true,如果没有按下则为 false),我只会在按下或释放键时更改图像,而不是在我按住它时吃下。下面是相关的 类.

package pack1;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class KeyHandler implements KeyListener {

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

        if (e.getKeyCode() == KeyEvent.VK_D) {

            Var.moveleft = true;

        }

    }

    @Override
    public void keyReleased(KeyEvent e) {

        if (e.getKeyCode() == KeyEvent.VK_D) {

            Var.moveleft = false;

        }

    }

}

package pack1;

import java.io.File;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

import javax.imageio.ImageIO;

public class Animation {

    Timer timer;

    public Animation() {

        timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {

                if (Var.moveleft == true) {

                    if (Var.bobImg == false) {

                        try {

                            Var.img3 = ImageIO.read(new File("rsc/Bob2.png"));

                        } catch (IOException e) {

                            e.printStackTrace();

                        }

                        Var.bobImg = true;

                    } else if (Var.bobImg == true) {

                        try {

                            Var.img3 = ImageIO.read(new File("rsc/Bob1.png"));

                        } catch (IOException e) {

                            e.printStackTrace();

                        }

                        Var.bobImg = false;

                    }

                }

            }

        }, 0, 100);

    }

}

是的,ideed 使用摆动计时器非常适合这样的事情:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.Timer;

public class Animation {

public Animation() {
        
        Timer timer;

        timer = new Timer(100, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                        if (Var.bobImg == true) {

                            try {

                                Var.img3 = ImageIO.read(new File("rsc/Bob1.png"));

                            } catch (IOException e1) {

                                e1.printStackTrace();

                            }

                            Var.bobImg = false;

                        } else if (Var.bobImg == false) {

                            try {
                                
                                Var.img3 = ImageIO.read(new File("rsc/Bob2.png"));

                            } catch (IOException e1) {

                                e1.printStackTrace();

                            }

                            Var.bobImg = true;

                        }

                    Var.lbl4.repaint();

            }

        });

    }

}