Вопрос
Я пишу игру, используя Java Swing. Я хочу рисовать каждый раз, когда петля выполняется с небольшой задержкой между ними, чтобы создать каскадный эффект на экране. Я полагаю, что процедуры эффективности в системе разрушают вызовы repaint()
в один звонок. Во всяком случае, все изменения происходят сразу после общей задержки. Есть ли какой -нибудь способ заставить систему немедленно перекрасить, а затем задержать каждую итерацию петли?
Мой код:
for(int i=0;i<10;i++){
JButton[i].setBackground(Color.WHITE);
JButton[i].repaint();
Thread.sleep(2000);
JButton[i].setBackground(Color.GRAY);
JButton[i].repaint();
}
Решение
Ты можешь использовать JComponent.paintImmediately
чтобы заставить немедленное перекрашение.
РЕДАКТИРОВАТЬ: После прочтения вашего вопроса снова приходит мне в голову, что вы можете выполнять свою логику в потоке отправки событий. Это будет означать, что запросы на перекрашение не будут выполнены до возврата вашего метода. Если вы поместите свой код в другой ветку, это, вероятно, решит проблему, и это будет намного приятнее, чем использование paintImmediately
.
void uiFunction() {
new Thread() {
public void run() {
for(int i = 0; i < 10; i++) {
final JButton b = buttons[i];
SwingUtilities.invokeLater(new Runnable() {
b.setBackground(Color.WHITE);
b.repaint();
}
Thread.sleep(2000);
SwingUtilities.invokeLater(new Runnable() {
b.setBackground(Color.GRAY);
b.repaint();
}
}
}
}.run();
}
Это немного грязно, но, надеюсь, это даст вам представление о том, с чего начать.
Другие советы
Не уверен, здесь ли я на правильном пути, но это проблема с веткой? Потому что сон будет спать нынешнюю ветку. Поэтому, если перекраска находится в текущем потоке, вы будете эффективно стоять в очереди на перекраску, удерживая, а затем очередь другой перекрашение. Затем метод заканчивается, а петля обработки событий в графическом потоке огнят, выполняя два перекрашенных (разрушенных), что делает все сразу.
Исходя из этой мысли, я думаю, у вас может быть два варианта:
Поместите код на второй поток, чтобы он не остановил основной графический ветку, а также потому, что это означает, что графическая тема Кандо перекрашивается вдоль сна, происходящего.
Прежде чем спать (я бы не подумал), запустите цикл события, чтобы заставить перекрашенность произойти. Я должен был искать это. Не могу вспомнить, как сделать это с макушки моей головы. :-)
Я бы, наверное, посмотрел на № 1 как лучший вариант.