【发布时间】:2013-06-16 02:37:32
【问题描述】:
如前所述,我正在使用两种不同版本的代码,第一个工作正常,没有任何问题,第二个,唯一没有发生的事情是更新图像(已验证通过逐步调试和调试打印手动验证所有值和条件)
/* properly updates dice[] JLabel icons */
for (int i = 0; i < game.getToRoll(); i ++){
//sets rolled dice to actual values
dice[i].setIcon(dicePic[(game.getDice(i).getFaceValue())]);
}
/* loops properly, generates properly, does not update icons */
Die x = new Die();
int animate = 0;
while(animate < 10){
for (int i = 0; i < 6; i++ ){
x.roll();
if (i <= (game.getToRoll() -1))
dice[i].setIcon(dicePic[x.getFaceValue()]);
else
dice[i].setIcon(dicePic[0]);
}
panel[1].repaint();
panel[1].validate();
animate++;
try{
Thread.sleep(100);
}
catch(Exception e){
e.printStackTrace();
}
}
我一直在寻找导致问题的某种想法,除了“有时重新绘制和验证会修复不起作用的问题”之外,我没有遇到任何其他问题。
如上所述,调试为我提供了完全按预期工作的代码流的绿灯,在第二个示例中只是空图像图标。
【问题讨论】:
-
下次别忘了添加java 标签,因为对于这个问题,这比任何其他标签都更重要。我已经添加了它。
-
不需要 repaint() 和 revalidate() 因为组件会在图标更改时自动执行此操作。此外,正确的顺序是 revalidate() 和 repaint(),因为您首先需要在重新绘制组件之前调用布局管理器。
-
可能没有必要,但我在这里找到了关于 Swing 无法按预期工作的线程,并且有时使用其中一种或两种方式可以解决问题。但是,感谢您提供有关它的信息,比盲目修复更好地了解我在做什么。