Как создать javax.swing.Timer, который запускается немедленно, а затем каждые t миллисекунды? - PullRequest
4 голосов
/ 16 сентября 2009

Прямо сейчас у меня есть код, который выглядит примерно так:

Timer timer = new javax.swing.Timer(5000, myActionEvent);

Согласно тому, что я вижу (и Javadocs для Timer класса ), таймер будет ждать 5000 миллисекунд (5 секунд), запускать событие действия, ждать 5000 миллисекунд, запускать снова , и так далее. Тем не менее, поведение, которое я пытаюсь получить, заключается в том, что таймер запускается, событие запускается, таймер ждет 5000 миллисекунд, снова запускается, затем ждет, прежде чем снова выстрелить.

Если я что-то пропустил, я не вижу способа создать таймер, который не ждет перед выстрелом. Есть ли хороший, чистый способ подражать этому?

Ответы [ 4 ]

10 голосов
/ 16 сентября 2009

Вы можете указать только задержку в конструкторе. Вам нужно изменить начальную задержку (время до срабатывания первого события). Вы не можете установить в конструкторе, но вы можете использовать метод setInitialDelay класса Timer.

Если вам не нужно ждать до первого выстрела:

timer.setInitialDelay(0);
2 голосов
/ 16 сентября 2009

Я не уверен, что это очень поможет, но:

Timer timer = new javax.swing.Timer(5000, myActionEvent){{setInitialDelay( 0 );}};
0 голосов
/ 16 сентября 2009

Простое решение:

Timer timer = new javax.swing.Timer(5000, myActionEvent);
myActionEvent.actionPerformed(new ActionEvent(timer, 0, null));

Но мне нравится timer.setInitialDelay(0) намного лучше.

0 голосов
/ 16 сентября 2009

Я бы вообще не использовал Таймер, но вместо этого использовал бы ScheduledExecutorService

import java.util.concurrent.*

...

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(myRunnable, 0, 5, TimeUnit.SECONDS);

Обратите внимание, что есть scheduleAtFixedRate() и scheduleWithFixedDelay(), которые имеют немного другую семантику. Прочитайте JavaDoc и выясните, какой вам нужен.

...