我的计时器 (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();
}
});
}
}
在下面的程序中,我尝试反复交换两个图像,以创建行走效果。为此,我创建了一个计时器,其中 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();
}
});
}
}