JLabel Icon未使用setIcon(或其他冗余)更新

时间:2013-06-16 02:37:32

标签: java swing icons jlabel

我正在使用的两个不同版本的代码,如前所述,第一个正常工作,没有任何问题,第二个,唯一没有发生的是图像的更新(已经验证)通过步骤调试和调试打印来手动验证所有值和条件)

            /* 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给我的代码流完全按照预期工作,只是第二个例子中的空图像图标。

1 个答案:

答案 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();