Java: Как я могу ждать updateUI? - PullRequest
1 голос
/ 09 октября 2011

Я делал демонстрацию по игре ChessBoard. Думаю, вы должны это знать. Как только я сталкиваюсь с проблемой. Результат просто показывают быстро. Я хочу посмотреть, как это работает медленно.

Вот основной код:

public void ChessBoard(int tr, int tc, int dr, int dc, int size) throws InterruptedException   {
        if (size == 1) {
            return;
        }
        Random rd = new Random();
        float red = rd.nextFloat();
        float green = rd.nextFloat();
        float blue = rd.nextFloat();
        Color col = new Color(red, green, blue);
        int s = size / 2;
        if (dr < tr + s && dc < tc + s) {
            ChessBoard(tr, tc, dr, dc, s);
        } else {
            button[tr + s - 1][tc + s - 1].setBackground(col);
            ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s);
        }
        if (dr < tr + s && dc >= tc + s) {
            ChessBoard(tr, tc + s, dr, dc, s);
        } else {
            button[tr + s - 1][tc + s].setBackground(col);
            ChessBoard(tr, tc + s, tr + s - 1, tc + s, s);
        }
        if (dr >= tr + s && dc < tc + s) {
            ChessBoard(tr + s, tc, dr, dc, s);
        } else {
            button[tr + s][tc + s - 1].setBackground(col);
            ChessBoard(tr + s, tc, tr + s, tc + s - 1, s);

        }
        if (dr >= tr + s && dc >= tc + s) {
            ChessBoard(tr + s, tc + s, dr, dc, s);
        } else {
            button[tr + s][tc + s].setBackground(col);
            ChessBoard(tr + s, tc + s, tr + s, tc + s, s);
        }


        mainPanel.updateUI();
        for (long i=1;i<10000;i++){
            for (long j=0;j<10000;j++){
                i+=1;
                i-=1;
            }
        }

    }

Но результат оказался мгновенным! Кажется, основная панель не закончила свою работу. MainJanel - это объект JPanel.

Ответы [ 4 ]

3 голосов
/ 09 октября 2011

Я также добавляю сон в начале, но замедляется только прогресс, кажется, не имеет ничего общего с отображением

Похоже, ваш код выполняется в потоке рассылки событий. Вы никогда не должны говорить EDT, чтобы спать (). Это предотвращает перекрашивание GUI. Прочитайте раздел из учебника по Swing на Concurrency для получения дополнительной информации.

Вместо этого вы должны использовать Swing Timer для планирования анимации каждого движения. В руководстве также есть раздел, посвященный таймерам.

2 голосов
/ 09 октября 2011

updateUI используется для изменения внешнего вида компонента. Чтобы перерисовать содержимое панели, вы должны использовать

mainPanel.repaint()
0 голосов
/ 09 октября 2011

Остановка выполнения с помощью sleep.

Пример

public class SleepMessages {
    public static void main(String args[]) throws InterruptedException {
        String importantInfo[] = {
            "Mares eat oats",
            "Does eat oats",
            "Little lambs eat ivy",
            "A kid will eat ivy too"
        };

        for (int i = 0; i < importantInfo.length; i++) {
            //Pause for 4 seconds
            Thread.sleep(4000);
            //Print a message
            System.out.println(importantInfo[i]);
        }
    }
}

Таким образом, это замедлит вашу программу.

 //Pause for 4 seconds
   Thread.sleep(4000);
0 голосов
/ 09 октября 2011

Просто используйте Thread.sleep( /* time in milliseconds */ ), чтобы замедлить выполнение.

...