2

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

            /* 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();
                    }
            }

我一直在寻找导致问题的某种想法,除了“有时重绘和验证会解决不起作用的问题”之外,我没有遇到任何其他问题。

如上所述,调试给了我完全按预期工作的代码流的绿灯,在第二个示例中只是空图像图标。

4

1 回答 1

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();
于 2013-06-16T02:52:07.010 回答