试图用Java动画模具

时间:2014-09-07 15:14:31

标签: java image dice

我试图动画" 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;面对。有没有人对为什么这不起作用有任何想法?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

这个问题每天都要问几次。如果您在事件调度线程中休眠,则会阻止它执行其工作:对事件做出反应并重新绘制屏幕。

你的动画应该在另一个线程中完成。阅读有关concurrency in Swing的教程,并使用Swing Timer。

答案 1 :(得分:0)

你正在使用的暂停()是你需要像汽车一样动画移动的东西,但只是改变一个JLabel的图标,这里的骰子不需要暂停(除非你只是想让它成为推迟一点)...

但无论如何,要解决您的问题,您需要在该JLabel或updateGraphics()上调用repaint()。设置JLabel的图标不会显示新的图标,只需要重新绘制()它。

当然像JB Nizet所说的那样,对于不挂起的应用程序,你需要在一个新线程上调用重绘。你应该学习如何使用Thread,因为它有时会非常棘手。 祝你好运