Как использовать класс Timer для периодической установки/сброса логического значения? (Джава)

Я пытаюсь создать игру «Ударь крота». Я использовал качели для создания фона и добавления изображений кротов с прослушивателями событий, которые увеличивают счет каждый раз, когда они нажимаются, но у меня возникают проблемы с настройкой того, должны ли они быть видимыми или нет. Я подумал, что лучший способ сделать это - использовать таймер для установки/сброса логического значения. Затем это логическое значение может быть передано в конструктор setVisible() изображения. Идеально было бы рандомизировать период, в течение которого изображения видны. Я попытался создать экземпляр класса таймера и задачи (наследуя timertask), вызвав timer.vis(vis), который должен сбросить логическое значение, а затем передать задачу в timer.schedule(), но я получаю исключение нулевого указателя. Я иду об этом неправильно?


person jacka92    schedule 28.10.2014    source источник
comment
пожалуйста, покажите нам трассировку стека и соответствующий код. слишком сложно сказать, где находится нулевой указатель, без какой-либо этой информации   -  person Philipp Sander    schedule 28.10.2014
comment
1) Чтобы быстрее получить помощь, опубликуйте MCVE (минимальный полный проверяемый пример). 2) Всегда копируйте/вставляйте ошибки и исключения! 3) См. Что такое трассировка стека и как ее использовать для отладки ошибок моего приложения? & Что такое исключение нулевого указателя и как его исправить?   -  person Andrew Thompson    schedule 28.10.2014
comment
Вот несколько примеров с использованием JToggleButton.   -  person trashgod    schedule 28.10.2014
comment
Используйте один таймер, но рандомизируйте состояние   -  person MadProgrammer    schedule 28.10.2014


Ответы (1)


Ну, это будет немного переворачиваться со случайными интервалами. Вы можете добавить код для вызова чего-либо в потоке SwingWorker в зависимости от значения бита после его изменения.

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicBoolean;

public class RandomBitFlip {
    public static void main(String[] args) throws InterruptedException {
        final AtomicBoolean var = new AtomicBoolean(false);
        final Timer timer = new Timer(true);

        randomlyFlip(timer, var);

        // To demonstrate, print the value every 200ms
        for(int x = 0; x < 300; x++) {
            System.out.println(var.get());
            Thread.sleep(200);
        }
    }

    private static void randomlyFlip(final Timer timer, final AtomicBoolean var) {
        final TimerTask task = new TimerTask() {
            @Override
            public void run() {
                var.set(!var.get());
                // Call SwingWorker thread here
                randomlyFlip(timer, var);
            }
        };
        timer.schedule(task, 500 + (long)(1500 * Math.random()));
    }
}
person BarrySW19    schedule 28.10.2014