У меня есть доска с плитками, а плитки содержат препятствия. Препятствие может быть одного из нескольких типов (стена, лазер, ...).
Каждый раунд игры я выполняю доску, которая выполняет все препятствия. Как только препятствие было выполнено и что-то изменилось, графический интерфейс уведомляется, и затронутые плитки обновляются.
В графическом интерфейсе плитка представляет собой OverLayLayout, который содержит перекрывающиеся изображения (JLabels), поэтому все перекрывающиеся изображения видны.
Теперь проблема в том, что когда я их выполняю, это происходит слишком быстро, вы ничего не можете сделать. Например. вы не видите появление лазерного луча, игрок будет поврежден, но вы этого не видели...
Поэтому я попытался позволить игре подождать, например. 500 мс, чтобы пользователь мог увидеть обновление графического интерфейса. Я пробовал (но, возможно, сделал это неправильно): таймеры, таймеры свинга, обратный отсчет, ... но я не могу заставить его работать. Есть какие нибудь идеи как это починить? Или, может быть, альтернатива ожиданию?
Заранее спасибо!
Обновление. Выполнение на доске выглядит следующим образом:
Iterator<Obstacle> it = obstacles.iterator();
while (it.hasNext())
it.next().execute(this);
CountDownLatch countDown = new CountDownLatch(1);
setChanged();
notifyObservers(countDown);
countDown.await();
Функция обновления платы GUI (которая уведомлена) выглядит так:
final CountDownLatch countDown = (CountDownLatch) arg;
SwingUtilities.invokeLater(new Runnable(){
public void run() {
try {
updateUI();
wait(500);
} catch (InterruptedException ex) { }
countDown.countDown();
}
});
updateUI()
в приложении Swing, если вы не меняете макет. Не вызывайте wait(...) в потоке событий, если только ваша цель не состоит в том, чтобы ваш графический интерфейс перестал отвечать на запросы. Почему бы просто не использовать Swing Timer? - person Hovercraft Full Of Eels   schedule 24.05.2012