我一直在尝试编写一个简单的图形化 Yahtzee,一旦轮到计算机,用户可以在显示下一个骰子之前看到最多三个 CPU 骰子的每一个骰子滚动几秒钟。但我尝试过的一切 - 使用 ActionListener、Thread.sleep()、invokeAndWait、长 while 循环的 Swing 计时器 - 本质上会跳过前两个验证/重绘,因此用户永远不会看到前两个滚动。我读过你不应该在 EDT 内暂停,但我不知道如何避免这种情况,因为流程是: userScoreBtn 单击 -> GUI 更新 #1 [暂停] -> GUI 更新 #2 [暂停] -> GUI 更新 #3。
我正在使用 Java Swing JFrame。
// tried stuff like...
Timer timer = new Timer(3000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e {
// roll code
contentPane.validate();
contentPane.repaint();
}
});
timer.setRepeats(false);
timer.start();
// works once, but not 3X like I want`
您将需要使用一个变量来跟踪动画的状态。例如:
Timer timer = new Timer(1000, new ActionListener() {
private int step;
@Override
public void actionPerformed(ActionEvent e) {
// roll code
switch (++step) {
case 1:
// Show first roll state
break;
case 2:
// Show second roll state
break;
case 3:
// Show third roll state
((Timer) e.getSource()).stop();
break;
default:
break;
}
contentPane.validate();
contentPane.repaint();
}
});
timer.setRepeats(true);
timer.start();
(实际上没有必要调用
setRepeats(true)
,因为计时器默认会重复,但我添加它是为了强调计时器需要为动画的每一帧重复。)
您不能使用循环来执行动画。 GUI 应用程序的执行由系统控制,而不是由程序员控制。