2011-01-12 3 views
1

Я создаю простую игру, и я хотел бы перекрасить ее после каждого хода. Итак, после того, как я назову move(), я бы хотел сделать следующее: (кстати, представление представляет собой JComponent, который содержит куски, так как количество элементов изменилось после перемещения, его нужно перекрасить)перекрашивать компоненты в петлю

for(View v : views){    
     v.repaint(); 
    } 

Это не работает. Когда я вызываю repaint() на один просмотр, он отлично работает. Я пробовал использовать paintImmediately, и revalidate, и update ... ничего не работает внутри цикла.

Любые идеи? Заранее спасибо.

EDIT: Я должен добавить, что repaint() вызывается при изменении размера окна, поэтому я знаю, что метод Paint ViewPomponent является действительным и работает. Это просто не вызывается из цикла. Когда отладчик проходит через цикл, он не вводит repaint(), и на экране ничего не происходит.

+0

Там нет ничего плохого с источником, что вы включили. Кажется вероятным, что вам нужно включить больше источника, о котором идет речь. – DwB

+0

Возможный дубликат http://stackoverflow.com/questions/4120528/repaint-in-a-loop – CoolBeans

+0

Я прочитал эту ветку - вот откуда у меня возникла идея попробовать PaintImmediately. Что касается публикации большего количества кода, что я должен публиковать? Метод paintComponent отлично работает (см. Отредактированный вопрос). – dj18

ответ

0

Иногда revalidate не работает, если ближайший validateRoot является JScrollPane. Не знаю, почему. Попробуйте вызвать revalidate на самом кадре, чтобы убедиться, что это работает. Если это так, у вас возникла проблема с правильной проверкой ваших компонентов validateRoot. Вам нужно будет только один раз перезвонить, когда цикл закончен.

1

Все, что связано с UI должен быть вызван в Event Диспетчерская тему (EDT):

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     for(View v : views){ 
      v.repaint(); 
     } 
    } 
}); 

Вы также можете использовать invokeAndWait вместо invokeLater. Вы должны прочитать на EDT, если вы хотите реагировать приложения.

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

Кроме того, обратите внимание на SwingUtilities.isEventDispatchingThread()