перекрасить в цикле - PullRequest
       8

перекрасить в цикле

2 голосов
/ 08 ноября 2010

Я пишу игру, используя 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();
}

Ответы [ 2 ]

6 голосов
/ 08 ноября 2010

Вы можете использовать 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();
}

Это немного грязно, но, надеюсь, это даст вам представление о том, с чего начать.

2 голосов
/ 08 ноября 2010

Не уверен, что я на правильном пути, но это проблема?Потому что сон будет усыплять текущий поток.Поэтому, если перерисовка находится в текущем потоке, вы будете эффективно ставить очередь в очередь, удерживая, а затем ставя в очередь другую перерисовку.Затем метод заканчивается, и цикл обработки событий графического потока запускается, выполняя две перерисовки (свернутые), заставляя все происходить одновременно.

Исходя из этой мысли, я думаю, что у вас может быть два варианта:

  1. Поместите код во второй поток, чтобы он не останавливал основной графический поток, а такжепотому что это означает, что графический поток выполняет перерисовку рядом с происходящим сном.

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

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

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