我正在使用两个不同版本的代码,如上所述,第一个版本工作正常,没有任何问题,第二个版本,唯一没有发生的是图像的更新(已验证)通过逐步调试和调试打印来手动验证所有值和条件)
/* 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>
如上所述,调试为我打开了代码流完全按预期工作的绿灯,只是第二个示例中的空图像图标。
最佳答案
问题是 Thread.sleep(100);
图标确实发生了变化,但您看不到变化,因为您阻塞了 UI 线程。
所以规则是:永远不要 hibernate EventDispatchThread!
我的建议是使用 Timer :
new javax.swing.Timer(200, new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
//do an icon change
}
}).start();
关于java - JLabel Icon 未使用 setIcon (或其他冗余)更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17129681/