我想用Java創建一個簡單的時鐘。該代碼是如此簡單,我舉一個例子:如何在循環中更改JLabel的文本而無需切換太快而用戶無法看到它?
for(int i=0;i<=60;i++)
jLabel11.setText(Integer.toString(i));
的問題是當我跑我的程序的結果並沒有顯示在序列中的每個更新。 它只顯示60位數字,沒有顯示從1到2到3的變化...
我該如何解決這個問題?
我想用Java創建一個簡單的時鐘。該代碼是如此簡單,我舉一個例子:如何在循環中更改JLabel的文本而無需切換太快而用戶無法看到它?
for(int i=0;i<=60;i++)
jLabel11.setText(Integer.toString(i));
的問題是當我跑我的程序的結果並沒有顯示在序列中的每個更新。 它只顯示60位數字,沒有顯示從1到2到3的變化...
我該如何解決這個問題?
問題是UI的更改應該在事件分派線程上運行,但阻止此循環(並阻止UI)將停止重新繪製屏幕。相反,使用定時器來執行定期更新,例如,
Timer timer = new Timer();
ActionListener updater = new ActionListener()
{
int count;
public void actionPerformed(ActionEvent event) {
jLabel11.setText(Integer.toString(count++));
if (count==60)
timer.stop();
}
}
timer.setDelay(100);
timer.addActionListener(updater);
timer.start();
請參閱Sun教程 - How to use Swing Timers。
要明確說明是'javax.swing.Timer',而不是其他類型的'Timer'找。還要注意'javax.swing.Timer'只能用在AWT事件派發線程(EDT)上,這對我來說似乎是一個不必要的限制。 – 2010-06-16 19:51:37
@Tom Hawtin - tackline:'javax.swing.Timer'的實例使用單個線程共享一個共同的'TimeQueue';爲方便起見''actionPerformed()'在EDT上運行。 – trashgod 2010-06-17 02:24:58
@trashgod我的意思是'Timer'只能在EDT上設置。 – 2010-06-17 02:44:09
如果你正在創建一個時鐘,你不應該得到系統時間,而不是輸出任意整數?如果您持續輪詢系統時間並顯示您將自動具有秒秒數字每秒更改的行爲 – 2010-06-16 19:03:09