2

私が使用している 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();
                    }
            }

問題の原因について何らかの考えを探し回っていますが、「再描画して検証すると、機能しないものを修正できる場合がある」ということ以外には遭遇していません。

前述のように、デバッグにより、コード フローが完全に期待どおりに機能していることがわかりました。2 番目の例では、画像アイコンが null になっているだけです。

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 に答える