Вопрос

Я пишу игру, используя 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. Поместите код на второй поток, чтобы он не остановил основной графический ветку, а также потому, что это означает, что графическая тема Кандо перекрашивается вдоль сна, происходящего.

  2. Прежде чем спать (я бы не подумал), запустите цикл события, чтобы заставить перекрашенность произойти. Я должен был искать это. Не могу вспомнить, как сделать это с макушки моей головы. :-)

Я бы, наверное, посмотрел на № 1 как лучший вариант.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top