我有一个计时器,当游戏事件发生时,它会在屏幕上显示动画。我想要做的是让主动执行暂停,直到这个动画结束,但我尝试的一切似乎阻止了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和侦听器:
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()中注释掉睡眠/等待行,动画就会运行,但程序不会暂停。
答案 0 :(得分:3)
一种方法是在动画进行时显示modal dialog。正如所讨论的here,用户交互将被排除,但响应javax.swing.Timer
的后台GUI更新将继续。您可以随时允许用户关闭对话框,如here所示,但您可能希望在此时放弃动画。
不需要用户输入。
您可以在动画开始后输入SecondaryLoop
来阻止用户交互而不显示对话框。
SecondaryLoop loop = Toolkit.getDefaultToolkit()
.getSystemEventQueue().createSecondaryLoop();
timer.start();
loop.enter();
动画结束时,exit()
SecondaryLoop
:
public void actionPerformed(ActionEvent e) {
…
if (index == iterations) {
timer.stop();
loop.exit ();
…
}
}
答案 1 :(得分:0)
你可以试试这个:
timer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// your code
}
});