我试图动画" Java中的掷骰子。我目前有一个图标(称为" diceImage")设置,当点击一个按钮(称为" diceRoll")时,更新模具面的新随机图像。我想做的是让它在几秒钟内多次改变图像(到一个随机模具面),然后停在最终图像上。
我遇到的问题不是生成一个随机数,也不是多次滚动,而是在循环内多次更新图像。下面的代码,将模具滚动10次是我到目前为止所做的:
private void diceRollActionPerformed(java.awt.event.ActionEvent evt) {
for (int i = 1; i <= 10; i++) {
rollDice();
pause(100);
}
}
这链接到以下两种方法(第一种方法生成随机数,并设置图标图像):
private void rollDice() {
Random r = new Random();
int randomNumber = r.nextInt(6) + 1;
diceImage.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Game/Images/Dice " + randomNumber + ".png")));
}
以下方法是&#34;假设&#34;在更新图像之间短暂暂停程序(这是从我正在编写的编程课程中获取的,我们必须为在屏幕上移动的汽车图像设置动画):
private void pause(int sleepTime) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
System.exit(-1);
}
}
所有这个程序似乎都是暂停,然后打印最后的骰子卷。它没有显示任何&#34;中间&#34;面对。有没有人对为什么这不起作用有任何想法?
非常感谢任何帮助。
答案 0 :(得分:1)
这个问题每天都要问几次。如果您在事件调度线程中休眠,则会阻止它执行其工作:对事件做出反应并重新绘制屏幕。
你的动画应该在另一个线程中完成。阅读有关concurrency in Swing的教程,并使用Swing Timer。
答案 1 :(得分:0)
你正在使用的暂停()是你需要像汽车一样动画移动的东西,但只是改变一个JLabel的图标,这里的骰子不需要暂停(除非你只是想让它成为推迟一点)...
但无论如何,要解决您的问题,您需要在该JLabel或updateGraphics()上调用repaint()。设置JLabel的图标不会显示新的图标,只需要重新绘制()它。
当然像JB Nizet所说的那样,对于不挂起的应用程序,你需要在一个新线程上调用重绘。你应该学习如何使用Thread,因为它有时会非常棘手。 祝你好运