2009-09-16 88 views
4

現在,我有一些代碼看起來是這樣的:如何創建一個立即觸發的javax.swing.Timer,然後每t毫秒?

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

據我所看到的(和Javadocs for the Timer class),定時器將等待5000毫秒(5秒),觸發動作事件,等待5000毫秒,再次發射,等等。然而,我試圖獲得的行爲是計時器啓動,事件被觸發,計時器等待5000毫秒,再次觸發,然後在再次觸發之前等待。

除非我錯過了一些東西,我沒有看到創建一個不會在開火之前等待的計時器的方法。有沒有一個好的,乾淨的方法來模擬這個?

回答

10

您只能在構造函數中指定延遲。您需要更改初始延遲(發射第一個事件之前的時間)。您不能在構造函數中設置,但可以使用Timer類的setInitialDelay方法。

如果你需要第一次發射前不需要等待:

timer.setInitialDelay(0); 
+0

這是唯一的辦法?如果可能的話,我想在構造函數中完成它,但似乎這是不可能的。哪種吸吮... – 2009-09-16 12:53:59

+0

沒有這樣的構造函數。不知道爲什麼。 – asalamon74 2009-09-16 12:59:06

+0

你也可以添加你的評論,關於這個不能通過構造函數設置你的帖子,以及?這隻會讓人們搜索更好。謝謝你的幫助。 – 2009-09-16 13:01:13

0

我不會用一個定時器可言,而是用一個ScheduledExecutorService

import java.util.concurrent.* 

... 

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

請注意,scheduleAtFixedRate()scheduleWithFixedDelay(),它們的語義略有不同。閱讀JavaDoc並找出你需要哪一個。

+2

對Swing組件的更新應該在EDT上完成。擺動計時器在EDT中執行。從我做的閱讀中,ScheduledExecutorService不在EDT中執行,不應該與Swing一起使用。 – camickr 2009-09-16 15:30:17

0

簡單的解決方案:

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

但我喜歡timer.setInitialDelay(0)好了很多。

2

我不知道這是否會是多大的幫助,但:

Timer timer = new javax.swing.Timer(5000, myActionEvent){{setInitialDelay(0);}}; 
+0

這是相當醜陋的,但我認爲最好的解決方案,因爲OP想要一個班輪。 +1 – brimborium 2014-10-09 13:13:32

相關問題