【问题标题】:Trying to animate a die roll in Java尝试在 Java 中为掷骰子设置动画
【发布时间】:2014-09-08 00:30:05
【问题描述】:

我正在尝试在 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")));

}

下面的方法是“假定”在更新图像之间短暂暂停程序(这是从我在编程课程中获得的,我们必须为汽车在屏幕上移动的图像制作动画):

private void pause(int sleepTime) {
    try {
        Thread.sleep(sleepTime);
    } catch (InterruptedException e) {
        System.exit(-1);
    }
}

这个程序似乎所做的只是暂停然后打印最后的掷骰子。它没有显示任何“中间”面孔。有没有人知道为什么这不起作用?

非常感谢任何帮助。

【问题讨论】:

  • diceImage是什么类型的?
  • diceImage 是一个 jLabel
  • 你为什么不做一个 BufferedImage 然后把它放到 diceImage 中呢?然后将 BufferedImage 更新为一个新的,让它改变滚动的图像?

标签: java image dice


【解决方案1】:

这个问题一天会被问好几次。如果你在事件调度线程中休眠,你会阻止它完成它的工作:对事件做出反应并重新绘制屏幕。

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

【讨论】:

    【解决方案2】:

    您正在使用的 pause() 是当您需要为移动物体(例如汽车)设置动画时,但只需更改 JLabel 的图标(这里的骰子)不需要暂停(除非您只是希望它是延迟了一点)...

    但无论如何,要解决您的问题,您需要对该 JLabel 或 updateGraphics() 调用 repaint()。为 JLabel 设置图标不会使新图标显示出来,您只需要 repaint() 即可。

    当然,就像 JB Nizet 所说的那样,要让应用程序不挂起,您需要在新线程上调用 repaint。我认为您必须学习如何很好地使用线程,因为它有时会非常棘手。 祝你好运

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 2014-10-07
      • 1970-01-01
      相关资源
      最近更新 更多