【发布时间】:2016-09-09 02:18:41
【问题描述】:
我有一个计时器,当游戏事件发生时,它会在屏幕上显示动画。我想要做的是让主执行暂停,直到这个动画完成,但我尝试的一切似乎都阻止了 Timer 运行。我尝试使用 Thread.sleep() 并在锁定对象上调用 wait() 和 notify(),但结果相同。 Timer 监听器的 actionPerformed() 永远不会被调用。
这段代码设置了计时器:
protected void showMovingEffect(int steps, Direction dir, AnimatedImageSet imgs) {
effectsPane.runAnimation(imgs, dir, steps);
waiting = true;
while (waiting) {
synchronized(animationWaitLock) {
try {
animationWaitLock.wait();
} catch (InterruptedException e) {}
}
}
}
还有 EffectsPane 对象中的 Timer 和 listener:
private void runAnimation(AnimatedImageSet ais, Direction dir, int iters) {
System.out.println("run");
imgs = ais;
top = 0;
left = 0;
topStep = dir.getRowIncrement() * 10;
leftStep = dir.getColIncrement() * 10;
iterations = iters;
index = 0;
active = true;
timer.start();
}
public void actionPerformed(ActionEvent e) {
System.out.println(index);
top += topStep;
left += leftStep;
index++;
currentImage = imgs.getImage(index);
repaint();
if (index == iterations) {
active = false;
timer.stop();
synchronized(animationWaitLock) {
animationWaitLock.notify();
}
waiting = false;
}
}
在 actionPerformed() 开始时的 System.out.println 调用永远不会被调用,因此 wait() 调用也正在暂停 Timer,或者有什么东西阻塞了它。如果我在 showMovingEffect() 中注释掉睡眠/等待行,动画会运行,但程序不会暂停。
【问题讨论】:
-
不要使用睡眠!!!!!
-
我不是。我正在使用 wait()。
标签: java swing animation timer thread-sleep