перекрасить компоненты в цикле - PullRequest
1 голос
/ 12 января 2011

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

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

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

Есть идеи? Заранее спасибо.

РЕДАКТИРОВАТЬ: Я должен добавить, что repaint () действительно вызывается при изменении размера окна, поэтому я знаю, что метод ViewC paintComponent является действительным и работает. Это просто не вызывается из цикла. Когда отладчик проходит по циклу, он не входит в repaint () и с экраном ничего не происходит.

Ответы [ 2 ]

1 голос
/ 14 января 2011

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

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

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

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

Также обратите внимание на SwingUtilities.isEventDispatchingThread ()

0 голосов
/ 13 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...