Выполнение Live / динамических изменений в Swing - PullRequest
1 голос
/ 29 декабря 2011

Я делаю игру, в которой есть квадраты (сетка панелей), и когда игра заканчивается, есть алгоритм, который меняет цвет панелей по очереди в «живом» режиме, когда пользователь наблюдает за изменением квадратов цвет медленно. Я пытаюсь что-то вроде:

Thread.sleep(1000);      

grid.getComponent(boxNumber).setBackground(Color.YELLOW);

Thread.sleep(1000); 

grid.getComponent(boxNumber).setBackground(Color.ORANGE);

Хотя цвет рамки меняется на Желтый, впоследствии он не меняется на Оранжевый. У кого-нибудь есть идеи? Надеюсь, я смог прояснить ситуацию.

Ответы [ 3 ]

2 голосов
/ 29 декабря 2011

Прочтите раздел из учебника Swing по Параллелизм , чтобы понять, почему вам не следует использовать метод sleep ().

Одно из решений - использовать SwingWorker, тогда выопубликуйте 'цвет компонента, чтобы он мог правильно обновляться в EDT, и вы также можете вызывать метод sleep () в работнике.

1 голос
/ 29 декабря 2011

-В общем, не стоит делать Thread.sleep(1000); в EDT. Вы должны попробовать использовать Таймеры .
-Ты также должен позвонить revalidate()/validate() and repaint() потом.

Так может быть что-то вроде этого:

Timer yellowTimer = new Timer(1000,new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
             jtp.setBackground(Color.YELLOW);
            //call revalidate()/validate() and repaint() afterward
             jtp.revalidate();
             jtp.repaint();
        }
    });
yellowTimer.setRepeats(false);

Timer orangeTimer = new Timer(2000,new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
             jtp.setBackground(Color.ORANGE);
             //call revalidate()/validate() and repaint() afterward
             jtp.revalidate();
             jtp.repaint();
        }
    });
orangeTimer.setRepeats(false);

yellowTimer.start();
orangeTimer.start();
1 голос
/ 29 декабря 2011

Это должно происходить в потоке событий Swing.вызывать фон с помощью:

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    grid.getComponent(boxNumber).setBackground(Color.ORANGE);
  }
});

Обратите внимание, ваш Thread.sleep() должен не находиться в потоке событий (или напрямую из прослушивателя событий Swing (ActionListener, WindowListener и т. д.).

Было бы также разумно посмотреть Swing Timing Framework , который специально для таких вещей.

...