Проблемы с моим Thread.sleep () - PullRequest
1 голос
/ 13 июля 2011

Я создаю простую программу для видео покера и сейчас я работаю над действием, которое выполняется после того, как пользователь указал карты, которые он хочет держать, и заменяю сброшенные карты новыми картами после розыгрыша.У меня есть действие, в котором я хочу заменить карты по одной с задержкой между всеми заменами, но с кодом, который у меня есть ниже, он будет работать в течение 500 мс, умноженный на количество карт, которые я должен заменить, и ТО заменить всекарты сразу, а не заменять их по одному, как я хочу.Любая помощь с благодарностью!

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++;                                  
            }               
        }
    };

1 Ответ

8 голосов
/ 13 июля 2011

Когда вы спите в потоке отправки событий (EDT), графический интерфейс останавливается.Каждое долгосрочное задание должно выполняться за пределами EDT, а все манипуляции с колебаниями должны выполняться в EDT.

Вы должны использовать SwingWorker, чтобы спать в другом потоке, и публиковать некоторый прогресс каждые 500 мс.Или вы можете использовать javax.swing.Timer, который будет запускать событие каждые 500 мс.

...