1

私は簡単なビデオポーカープログラムを作成しています.現在、ユーザーが保持したいカードを指定した後に実行されるアクションに取り組んでおり、ドロー後に捨てられたカードを新しいカードに置き換えます. カードを 1 枚ずつ交換し、すべての交換の間に遅延を設けたいアクションがありますが、以下のコードを使用すると、500 ミリ秒に交換する必要があるカードの数を掛けてスリープし、すべて交換します。私が望むように一度に1枚ずつ交換するのではなく、一度にカードを交換してください。どんな助けでも大歓迎です!

Action drawAction = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
            int deckPos = 5;

            if((holdValFirst.getText()).equals("HELD")){}
            else{                   
                holdFirst.setIcon(new ImageIcon(((deck.getDeck())[deckPos]).getCardName()+".gif"));
                deckPos++;
                try
                {
                    Thread.sleep(500);              
                }catch (InterruptedException ie){
                    System.out.println(ie.getMessage());
                }
            }
            if((holdValSecond.getText()).equals("HELD")){}
            else{                   
                holdSecond.setIcon(new ImageIcon(((deck.getDeck())[deckPos]).getCardName()+".gif"));
                deckPos++;
                try
                {
                    Thread.sleep(500);              
                }catch (InterruptedException ie){
                    System.out.println(ie.getMessage());
                }               
            }
            if((holdValThird.getText()).equals("HELD")){}
            else{
                holdThird.setIcon(new ImageIcon(((deck.getDeck())[deckPos]).getCardName()+".gif"));
                deckPos++;
                try
                {
                    Thread.sleep(500);              
                }catch (InterruptedException ie){
                    System.out.println(ie.getMessage());
                }                   
            }
            if((holdValFourth.getText()).equals("HELD")){}
            else{                   
                holdFourth.setIcon(new ImageIcon(((deck.getDeck())[deckPos]).getCardName()+".gif"));
                deckPos++;  
                try
                {
                    Thread.sleep(500);              
                }catch (InterruptedException ie){
                    System.out.println(ie.getMessage());
                }               
            }
            if((holdValFifth.getText()).equals("HELD")){}
            else{                                       
                holdFifth.setIcon(new ImageIcon(((deck.getDeck())[deckPos]).getCardName()+".gif"));
                deckPos++;                                  
            }               
        }
    };
4

1 に答える 1

8

イベント ディスパッチ スレッド (EDT) 内でスリープすると、GUI がフリーズします。長時間実行されるすべてのタスクは EDT の外部で実行する必要があり、すべてのスイング操作は EDT で実行する必要があります。

a を使用しSwingWorkerて別のスレッドでスリープし、500 ミリ秒ごとに進行状況を公開する必要があります。javax.swing.Timerまたは、500ms ごとにイベントを発生させる を使用することもできます。

于 2011-07-12T20:12:57.987 に答える