我正在使用的两个不同版本的代码,如前所述,第一个正常工作,没有任何问题,第二个,唯一没有发生的是图像的更新(已经验证)通过步骤调试和调试打印来手动验证所有值和条件)
/* 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();
}
}
我一直在寻找能够解决导致问题的原因的某种想法,而且除了那些之外我还没有遇到任何其他问题“有时重新涂抹和验证会解决无效的问题。” / p>
如上所述,debug给我的代码流完全按照预期工作,只是第二个例子中的空图像图标。
答案 0 :(得分:4)
问题是Thread.sleep(100);
图标确实发生了变化,但您没有看到更改,因为您阻止了UI线程。
所以规则是:永远不要睡觉EventDispatchThread!
我的建议是使用Timer:
new javax.swing.Timer(200, new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
//do an icon change
}
}).start();