Как вызвать немедленное обновление графического интерфейса Java? (конфликт с Thread.sleep ())

Я делаю игру «Память», когда вы выбираете две карты, и если они совпадают, вы оставляете их себе, в противном случае возвращаете их обратно. Если вы затем вспомните карты, которые вы уже выбрали, вы сможете лучше угадать следующие две карты.

Моя проблема связана с методом repaint () , который не перерисовывается немедленно.

Когда я переворачиваю вторую карту, независимо от результата, я хочу показать обе карты перевернутыми, прежде чем либо их сбросить, либо перевернуть. Я делаю это, вызывая sleep () .

Конечно, если я repaint () карты, чтобы перевернуть их правой стороной вверх, подождать секунду, а затем repaint () снова на основе их значений, полезная маленькая Java буду перекрашивать только один раз (скучаю по C!).

Обычно я хочу вызвать обновление до того, как я sleep () . Я читал некоторые другие потоки, которые в основном говорят, что лучший способ - создать два потока, чтобы ваша логика и графика были разделены, а затем вы можете sleep () свою логику и поддерживать обновление вашего графического интерфейса, но я первый семестр первого года курса CS в старшей школе, и я хотел бы сохранить его на уровне курса (хотя я потратил довольно много времени на летние разработки и кодирование на C).

Поскольку я знаю, что полезные люди из StackOverflow любят читать код, вот часть программы, о которой я говорю ниже. Класс HitArea является объектом Card, а массив cards [] содержит количество HitArea . (Я не успел переименовать ] HitArea класс). activeCard1 и activeCard2 - это экземпляры HitArea , которые я использую для отслеживания двух выбранных пользователем вариантов, а пустой конструктор является зарезервированным «невидимым» HitArea , хотя позже я изменю его на null. Наконец, cards.flip () инвертирует переключатель логический, который определяет, находится ли карта правой стороной вверх.

public void respond(HitArea choice)
{
    if(choice.inGame)
    {
        if(activeCard1.value == 0 && activeCard1.value == 0)
            activeCard1 = choice;
        else if((!(activeCard1.value == 0) && activeCard2.value == 0) && (activeCard1.id != choice.id))
        {
            activeCard2 = choice;
            check();
        }

    }
}
public void check()
{
    update();
    pause(250);
    if(activeCard2.value == activeCard1.value)
    {
        score += 2;
        activeCard1.inGame = false;
        activeCard2.inGame = false;
    }
    activeCard1.flip();
    activeCard2.flip();
    activeCard1 = new HitArea();
    activeCard2 = new HitArea();
}
public void pause(int milliseconds)
{
    try{
      Thread.currentThread().sleep(milliseconds);
    }
    catch(InterruptedException e){
        System.out.println("Exception: " + e);
    }
}

public void mousePressed(MouseEvent e)
{
    int x = e.getX();
    int y = e.getY();

    for (int i = 0; i < cardNum; i++)
        if(cards[i].boundsCheck( x, y ) )
        {
            repaint();
            cards[i].flip();
            respond(cards[i]);
        }
}

Я не сомневаюсь, что в моем коде есть некоторые проблемы, поэтому не стесняйтесь указывать на них. Я думаю, что моя базовая структура в порядке, и я бы предпочел не создавать несколько потоков для этого проекта (помните, это базовая!).

7
задан ROMANIA_engineer 10 February 2017 в 08:42
поделиться