2016-05-23 42 views
1

我把這裏的學習Java程序 https://www.utdallas.edu/~dheroy/4331code/book/ImageAudioAnimation.java的javax振盪定時器 - 改變延遲時間

我已經在這個節目

private int[] delays = 
    {48000, 54000, 59000, 54000, 59000, 31000, 68000}; 
private Timer timer = new Timer(delays[0], new TimerListener()); 

計時器與延遲的值初始化爲0注意到一個缺陷]() 現在計時器是停留在此整個程序。即使我們稱之爲這一行代碼

timer.setDelay(delays[index]); 

我想重寫這個程序,使它做它應該做的事情。我堅持讓這個計時器從它初始化的時候開始改變。自2012年以來,我一直沒有在Java中工作過,所以我對它有點生疏,尤其是GUI的一面。

我應該溝Timer對象,並拿出另一種方式來跟蹤經過的時間?

回答

3

你需要做兩件事情:

  • 設置初始延遲太大,否則定時器將繼續等待不亞於最初規定。
  • 重新啓動計時器。

您可以設置一個非常低的延遲是這樣的:

timer.setInitialDelay(5); 
    timer.setDelay(5); 
    timer.restart(); 
+0

謝謝。我用timer.setInitialDelay()包裝了timer.setDelay(); 和timer.restart();這似乎讓程序按預期工作。乾杯!!! –

2

引述docs

擺動計時器(javax.swing.Timer中的一個實例)在指定的延遲後的一個或多個 動作事件觸發。不要將Swing定時器 與java.util包中的通用定時器工具混淆。這個 頁面只描述了Swing定時器。

一般情況下,我們推薦使用Swing的計時器,而不是 通用定時器用於GUI相關的任務,因爲搖擺定時器所有 共享相同的,預先存在的計時器線程,並自動圖形用戶界面相關的任務 對事件執行-dispatch線程。但是,您 可能使用通用定時器,如果你不從計時器觸摸 GUI計劃,或需要進行長時間的處理。

底線,如果您的javax.swing.Timer影響GUI,請繼續使用它。否則,您可能需要調查ScheduledThreadPoolExecutor

針對您的特殊可變延遲問題,你可以參考API

[調用setDelay]不會影響初始延遲屬性, 可以由setInitialDelay方法進行設置。

+0

setInitialDelay()似乎是被需要的。註釋掉setDelay並重新啓動();該程序只需要setInitialDelay()而不是setDelay。有人應該讓該程序的發佈者知道他搞亂了什麼。 **嘿嘿** –

+0

@JosephKreifelsII是的,看到了這個,並贊成了Tamas的回答。 – Mena