Обновить графический интерфейс Swing

У меня есть доска с плитками, а плитки содержат препятствия. Препятствие может быть одного из нескольких типов (стена, лазер, ...).

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

В графическом интерфейсе плитка представляет собой 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();
   }
});

person Seppe Magiels    schedule 23.05.2012    source источник
comment
Без какого-либо кода это похоже на слепого уборщика, пытающегося выбраться из казино (к вашему сведению, казино построены как лабиринты, чтобы удерживать людей внутри).   -  person Radu Murzea    schedule 23.05.2012
comment
Пока мы в этом, у меня есть проблема в моем проекте Java прямо сейчас. Я пробовал много вещей, и это просто не работает. Есть идеи, как это исправить, ОП?   -  person Marko Topolnik    schedule 23.05.2012
comment
Никогда не вызывайте updateUI() в приложении Swing, если вы не меняете макет. Не вызывайте wait(...) в потоке событий, если только ваша цель не состоит в том, чтобы ваш графический интерфейс перестал отвечать на запросы. Почему бы просто не использовать Swing Timer?   -  person Hovercraft Full Of Eels    schedule 24.05.2012
comment
Что мне вызывать вместо updateUI()? перепроверить и перекрасить ()?   -  person Seppe Magiels    schedule 24.05.2012


Ответы (1)


Не видя вашего кода, трудно определить проблему; Я подозреваю, что вы блокируете поток отправки событий.

В этой игре используется экземпляр javax.swing.Timer для анимации игры. Нажмите A, чтобы включить анимацию, и щелкните свободный квадрат, чтобы увидеть эффект. Возможно, вы сможете адаптировать подход к своей игре.

person trashgod    schedule 23.05.2012
comment
Кажется, была небольшая проблема с обновлением графического интерфейса после перерисовки панели... Теперь Swing Timer работает как шарм! Спасибо! - person Seppe Magiels; 24.05.2012