Как создать javax.swing.Timer, который запускается немедленно, а затем каждые t миллисекунды?
Прямо сейчас у меня есть код, который выглядит примерно так:
Timer timer = new javax.swing.Timer(5000, myActionEvent);
В соответствии с тем, что я вижу (и Javadocs для Timer
класс), таймер будет ждать 5000 миллисекунд (5 секунд), запускать событие действия, ждать 5000 миллисекунд, запускать снова и так далее. Тем не менее, поведение, которое я пытаюсь получить, заключается в том, что таймер запускается, событие запускается, таймер ждет 5000 миллисекунд, снова запускается, затем ждет, прежде чем снова выстрелить.
Если я не пропустил что-то, я не вижу способа создать таймер, который не ждет перед выстрелом. Есть ли хороший, чистый способ подражать этому?
4 ответа
Вы можете указать только задержку в конструкторе. Вам нужно изменить начальную задержку (время до срабатывания первого события). Вы не можете установить в конструкторе, но вы можете использовать метод setInitialDelay класса Timer.
Если вам не нужно ждать до первой стрельбы:
timer.setInitialDelay(0);
Я не уверен, поможет ли это, но:
Timer timer = new javax.swing.Timer(5000, myActionEvent){{setInitialDelay( 0 );}};
Я бы вообще не использовал Таймер, но вместо этого ScheduledExecutorService
import java.util.concurrent.*
...
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(myRunnable, 0, 5, TimeUnit.SECONDS);
Обратите внимание, что есть scheduleAtFixedRate()
а также scheduleWithFixedDelay()
которые имеют немного другую семантику. Прочитайте JavaDoc и выясните, какой вам нужен.
Простое решение:
Timer timer = new javax.swing.Timer(5000, myActionEvent);
myActionEvent.actionPerformed(new ActionEvent(timer, 0, null));
Но мне нравится timer.
setInitialDelay
(0)
намного лучше.